2016-01-11 2 views
2

Я знаком с использованием AsyncTask в Android: создайте подкласс, вызовите выполнение в экземпляре подкласса, а onPostExecute вызывается в потоке пользовательского интерфейса или в главном потоке. Что эквивалентно в быстром?Grand Central Dispatch (GCD) in swift

+1

Re: GCD не является «наибольшим общим делителем» :) –

+1

, так как * я * не знаком с Android, попробуйте объясните, что вы хотите достичь, не слишком много перекрестных ссылок! – luk2302

+0

Apple предоставляет «Руководство по программированию параллелизма» ... –

ответ

8

Это решает большинство моих требований асинхронными в Swift:

public func background(function: @escaping() -> Void) { 
    DispatchQueue.global().async(execute: function) 
} 

public func main(function: @escaping() -> Void) { 
    DispatchQueue.main.async(execute: function) 
} 

Затем используйте как:

background { 
    // I'm in the background 
    main { 
     // I'm back on Main 
    } 
} 

Например:

background { [weak self] in 
    let result = longOperationToFetchData() 
    main { 
     self?.data = result.data 
     self?.reloadTableView() 
    } 
} 
+0

Можно ли привести пример? –

+0

@ J.Arji супер поздно, извините, но добавил быстрый пример и обновленный ответ для последнего swift – Logan

3

Я думаю, используя NSOperationQueue более элегантный и просто. Вы можете создать очередь:

var queue = NSOperationQueue() 

И создать задачу:

let operation = NSBlockOperation {() -> Void in 
// Perform your task 
} 

После этого поставить задачу в очередь

queue.addOperation(operation) 

То есть. В случае, если вы хотите выполнить UI связанных задач, используя этот блок кода:

NSOperationQueue.mainQueue().addOperationWithBlock {() -> Void in 
// UI related task 
} 

NSOperationQueue предлагает простой способ установить зависимость между задачами. Например, у вас есть 4 задачи, op1, op2, op3, op4. И вы хотите, чтобы op1 нужно сделать, прежде чем op2, то вы можете написать так:

op2.addDependency(op1) 

Тогда op2 будет уволен после того, как op1 сделано. Поскольку нет зависимости от op3 и op4, это можно сделать до/или после op2

+1

ваш ответ приятный, но он работает только на платформе apple ... libdispatch в настоящее время доступна на всех платформах Darwin, на linux и т. Д. и, к счастью, будет доступен как «стандартная» часть Swift 3.0 (NSOperation как часть фонда Swift 3.0 Foundation еще не реализована). На платформе Apple +1 для вас! – user3441734

+0

@ J.Arji На самом деле, «NSOperation» с _block_ и «NSOperation» является самым близким, что вы можете подражать «AsyncTask» на Android. блоки, отправленные в очереди отправки, весьма схожи - но это средство также служит для четкого определения ограничений параллелизма и QoS. И _concurrent_ 'NSOperations', представленный в NSOperationQueue, является чем-то совершенно другим - они выполняют _asynchronous_ задачи в каком-то частном контексте выполнения, а не в самой очереди. – CouchDeveloper

Смежные вопросы