Выполняю URLSession.shared.downloadTask
запрос, но хотел бы выполнить код в том же потоке, на котором был выполнен downloadTask
. Например:Как выполнить блок на экземпляре потока?
func sample() {
let thread = Thread.current
URLSession.shared.downloadTask(with: file) {
someFunc() //How to execute on thread variable?
}.resume()
}
В обработчик завершения downloadTask
, он работает в фоновом потоке. Тем не менее, я бы хотел позвонить someFunc()
в ту же самую нить sample()
. Как мне что-то вроде Thread.current.async {...}
, так что я могу это сделать:
func sample() {
let thread = Thread.current
URLSession.shared.downloadTask(with: file) {
thread.async { someFunc() } //Doesn't compile
}.resume()
}
Это может решить проблему, но потоки очень низкоуровневые и сложные. Вы должны изменить вызов метода 'sample', который должен быть передан этому конкретному потоку через' выполнить on: '. Возможно, вам придется иметь дело с событиями вне порядка, создаваемыми другими потоками между 'sample' и' someFunc' ... То же самое можно архивировать с использованием высокоуровневых API, таких как 'OperationQueue', которые должны быть предпочтительным способом. – andih
Я согласен, поэтому я закрыл «использовать GCD, если можно». Это, однако, не является хорошим вариантом использования для очередей операций. И блокирование вызывающего потока, как и в вашем ответе, никогда не является хорошей идеей. – Rob
Вы правы, следует избегать блокирующего подхода. Другой подход, который позволяет избежать блокировки, заключается в использовании зависимых операций. – andih