2015-08-21 3 views
0

У меня возникли проблемы с пониманием того, как создать синхронный NSOperationQueue. Я создал прототип, который в основном говорит:Устранение неполадок NSOperation & NSOperationQueue (swift)

  • Создание 4 операции, очень длинные или очень короткие, чтобы завершить
  • Независимо от времени, чтобы закончить, они должны закончить в порядке, в котором они созданы очереди.

Мой NSOperation класс очень просто:

class LGOperation : NSOperation 
{ 
    private var operation:() ->() 
    init(operation:() ->()) 
    { 
     self.operation = operation 
    } 

    override func main() 
    { 
     if self.cancelled { 
      return 
     } 
     operation() 
    } 
} 

И мой тестовый класс также достаточно прост:

class LGOperationTest 
{ 

    class func downloadImage(url: String) 
    { 
     // This is a simple AFHTTPRequestOperation for the image 
     LGImageHelper.downloadImageWithUrl(url, complete: { (image: AnyObject?) in 
      println("downloaded \(url)") 
     }) 
    } 

    class func test() 
    { 
     var queue = NSOperationQueue.mainQueue() 
     queue.maxConcurrentOperationCount = 1 
     var op1 = LGOperation(operation: { self.downloadImage("http://www.toysrus.com/graphics/tru_prod_images/Animal-Planet-T-Rex---Grey--pTRU1-2909995dt.jpg") }) 

     var op2 = LGOperation(operation: { println("OPERATION 2") }) 

     var op3 = LGOperation(operation: { self.downloadImage("http://www.badassoftheweek.com/trex.jpg") }) 

     var op4 = LGOperation(operation: { println("OPERATION 3") }) 
     var ops: [NSOperation] = [op1, op2, op3, op4] 
     op2.addDependency(op1) 
     op3.addDependency(op2) 
     op4.addDependency(op3) 
     op4.completionBlock = { 
      println("finished op 4") 
     } 

     queue.addOperation(op1) 
     queue.addOperation(op2) 
     queue.addOperation(op3) 
     queue.addOperation(op4)  
     println("DONE") 
    } 
} 

Так что я бы ожидать здесь для операции, чтобы закончить в порядке, вместо этого выход:

Почему я не могу сделать веб-запросы огня синхронно с другим кодом? (Я знаю, что могу использовать блоки завершения и связывать их, но я хотел бы выяснить, как это сделать с NSOperation)

ответ

0

Операционные очереди используются для планирования асинхронных операций, в первую очередь эти операции могут длиться долго, t хотите заблокировать поток текущего (обычно UI). Блокирование потока пользовательского интерфейса приводит к невосприимчивости к пользовательскому интерфейсу.

Когда вы создаете 4 операции, когда они заканчиваются, это фактор того, что выполняется. В вашем случае у вас есть операции, которые делают println (что очень быстро), и у вас есть операции, которые загружаются из Интернета (что очень медленно).

Весь смысл очереди операций заключается в том, чтобы вы могли активировать эти операции асинхронно и всякий раз, когда операции завершены, запустите обработчик завершения.

Другими словами, вы не можете контролировать последовательность.

Если вы хотите, чтобы контролировать последовательность, мое предложение сделать следующее:

  1. Начало работы 1
  2. В обработчике завершения операции 1, начните операцию 2
  3. В обработчике завершения работы 2, в начать операцию 3
  4. В обработчик завершения операции 3'S, начать операцию 4

В этом Кстати, вы по-прежнему получаете преимущества очередей операций (вы не блокируете поток пользовательского интерфейса), и вы можете упорядочить операции по порядку.

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