2016-08-18 8 views
3

После прочтения стольких сообщений о параллельном и параллельном я все же путаю то, что является правильным способом получения данных. Например, в моем проекте у меня есть кнопка для пользователя для извлечения данных. Мой код - это что-то вроде ниже.dispatch_async vs dispatch_sync в данных выборки. Swift

var array = [Int]() 
func fetchData() { 

    .... 
    .... 
    response(objects: [object], error: NSError?) { 
     for object in objects { 
      array.append(object.number) // assume object.number return an Int 
     } 

     // confuse here. Should I use async here because I am worry if the user 
     // click the fetchData button more than one time, the append and make 
     // function will be happened at the same time. Or, is there anything I 
     // made a wrong assumption? I guess I need a serial operation. Correct? 

     dispatch_async(dispatch_get_main_queue()) { 
      makeCollectionView() // using the data in array 
     } 
    } 
} 

UPDATE

Пытался запустить этот код. 10000-19999 запускается после 0-9999. Кажется, второй асинхронный вызов не остановит первый асинхронный процесс для его работы.

dispatch_async(dispatch_get_main_queue(), {() -> Void in 
    for i in 0 ..< 10000 { 
     print(i) 
    } 
}) 
dispatch_async(dispatch_get_main_queue(), {() -> Void in 
    for i in 10000 ..< 20000 { 
     print(i) 
    } 
}) 

ответ

0

GCD предоставляет очереди для выполнения задач. Очереди могут быть двух типов: параллельные или серийный. В задачах последовательной очереди выполняются по одному (по порядку FIFO), в параллельной очереди - несколько задач по времени.

Чтобы предотвратить выбор данных пользователем при выполнении одной задачи выборки, в настоящий момент необходимо не отправлять задачу выборки в очередь. Независимо от того, какая это очередь - параллельная или последовательная.

var array = [Int]() 
var isFethingData = false 

func fetchData() { 
    if !isFethingData { 
     isFethingData = true 
     dispatch_async(queueForFetchData) { 
      … 
      response(objects: [object], error: NSError?) { 
       for object in objects { 
        array.append(object.number) 
       } 

       dispatch_async(dispatch_get_main_queue()) { 
        makeCollectionView() 
       } 
       isFethingData = false 
      } 
    } 
} 

dispatch_async и dispatch_sync это функция, которые подадут задачу очереди. Разница в том, что dispatch_async вернуться сразу же после выполнения задачи, но dispatch_sync дождитесь завершения задачи. Например:

print("\(NSDate()) qq") 
dispatch_sync(queue) { 
    // … some code which runs for 10 minutes. 
    print("\(NSDate()) ee") 
} 
print("\(NSDate()) ww") 
// 2016-08-18 16:02:00 qq 
// 2016-08-18 16:12:00 ee 
// 2016-08-18 16:12:00 ww 


print("\(NSDate()) qq") 
dispatch_async(queue) { 
    // … some code which runs for 10 minutes. 
    print("\(NSDate()) ee") 
} 
print("\(NSDate()) ww") 
// 2016-08-18 16:02:00 qq 
// 2016-08-18 16:02:00 ww 
// 2016-08-18 16:12:00 ee 
+0

Замечательный ответ, чтобы очистить от путаницы. Thanks –

+0

Opps. Еще один вопрос. Если я вызову dispatch_async (queue) {makeCollectionView()} дважды, второй makeCollectionView будет запущен сразу после первого или второго, который немедленно остановит первый и запустит? если он немедленно остановит первый, есть ли какая-либо функция, которую я могу поставить в качестве первой задачи в очереди? –

+0

Обновлено некоторая информация –

1

Чтобы увеличить производительность, все, что связано с пользовательским интерфейсом, должно работать на основной теме. Таким образом, в основном:

dispatch_async(dispatch_get_main_queue()) { 
     //anything that involves UI 
    }