2016-05-10 2 views
0

Мне нужно сделать некоторые вызовы API, и я хочу, чтобы они вернулись в том порядке, в котором они выходили. Правильно ли это происходит?NSOperationQueue - работает синхронно

  1. Создать NSOperationQueue, установить максимальное количество одновременных операций 1
  2. Создать URL Строка для API
  3. Создать NSOperation блок, метод вызова для вызова API, передать строке адреса
  4. Добавить NSOperation в NSOperationQueue

Здесь я смущаюсь. Установка максимальных параллельных операций на 1 по существу делает NSOperationQueue в синхронной очереди, одновременно вызывается только одна операция. Тем не менее, каждая операция будет делать вызов NSURLSession, который является асинхронным. Как я могу гарантировать, что следующая операция не будет работать до тех пор, пока я не закончу с первой? (По окончании я хочу сохранить возвращенный JSON в NSArray, добавив каждый дополнительный возвращенный JSON в этот массив).

ответ

0

Правильный способ гарантировать, что запуск NSOperation - это добавить зависимости. Зависимости являются мощными, поскольку они позволяют упорядочивать разные операции в разных очередях. Вы можете выполнить вызов API или обработку данных в фоновом режиме; при завершении зависимая операция может обновлять пользовательский интерфейс в основном потоке.

let operation1 = NSBlockOperation { 
    print("Run First - API Call") 
} 

let operation2 = NSBlockOperation { 
    print("Run Second - Update UI") 
} 
operation2.addDependency(operation1) 

let backgroundQueue = NSOperationQueue() 
backgroundQueue.addOperation(operation1) 
NSOperationQueue.mainQueue().addOperation(operation2) 

// operation1 will finish before operation2 is called, regardless of what queue they're in 

См Apple, Docs на addDependency в NSOperation здесь: https://developer.apple.com/library/mac/documentation/Cocoa/Reference/NSOperation_class/index.html#//apple_ref/occ/cl/NSOperation

Кроме того, будьте осторожны с допущением, что maxConcurrentOperationCount = 1, как и все, что она делает, это гарантирует, что только одна операция будет выполняться одновременно. Это НЕ гарантирует порядок очереди. Операция с более высоким приоритетом, скорее всего, будет работать в первую очередь.