2015-07-27 3 views
0

У меня есть несколько функций, которые должны выполняться в порядке. И function1 и function3 бежать в задней нитке. Их функции: findObjectsInBackgroundWithBlock. Function 2 может происходить на основной нити или на обратной нити, но она должна работать после function 1 и function 3 должна произойти сразу после function2. Я узнал о NSOperation и NSOperationQueue, но я не уверен, как его использовать. Основываясь на том, что я исследовал, я могу сделать класс только для подкласса NSOperation. Это верно? Я хотел бы сделать каждую функцию ниже NSOpeation. Ниже я думаю, что это правильно. Это правильный подход? И правильно ли поставить функцию1() внутри NSOperation, как показано ниже? Наконец, это влияет на NSOperationQueue, когда некоторые функции происходят в обратной нити, например function 1 & 3? СпасибоNSOperation для управления рядом функций

var operationQueue = NSOperationQueue() 
let operation1 : NSOperation = NSOperation(function1()) 
let operation2 : NSOperation = NSOperation(function2()) 
let operation3 : NSOperation = NSOperation(function3()) 

operation2.addDependency(operation1) 
operation3.addDependency(operation2) 

operationQueue.addOperation(operation1) 
operationQueue.addOperation(operation2) 
operationQueue.addOperation(operation3)   

func function1() { 
//do something and save data in this class's property 
} 

func function2() { 
//get data from class's property(data from function1) and do something 
//save the result in class's property 
} 

func function3() { 
    //get data from class's property(data from function2) and do something 
//save the result in class's property 
} 
+0

Использование операций блока. – nanjunda

ответ

1

Вы можете использовать NSBlockOperation, чтобы обернуть блок, как это:

let operationQueue = NSOperationQueue() 

    let operation1 = NSBlockOperation { 
     // body of function 1 
    } 

    let operation2 = NSBlockOperation { 
     // or call function 2 
    } 

    operation2.addDependency(operation1) 

    operationQueue.addOperation(operation1) 
    operationQueue.addOperation(operation2) 

Кроме того, вы можете напрямую Ставить блоки на очереди:

operationQueue.addOperationWithBlock { 
     // body of function 3 
    } 

Недостатком является то, у вас нет доступа к операции, поэтому вы не можете устанавливать зависимости.

+0

Спасибо! Я не понимаю, что я не могу настроить зависимости, когда вы написали «addDependency». Можете ли вы объяснить немного больше? – Kahsn

+0

Этот подход не будет работать, когда три функции сами по себе являются асинхронными. – Rob

+1

@ Kahsn. Его дело в том, что если вы используете 'addOperationWithBlock', вы не можете использовать зависимости (потому что' addOperationWithBlock' создает операцию и добавляет ее в очередь, но никогда не возвращает ссылку 'NSOperation', которая вам нужна для' addDependency'). Но если вы используете 'NSBlockOperation', он отлично работает (но только если функции выполняются синхронно). – Rob

1

Чтобы зависимости для правильной работы, когда ваши функции, сам, выполняя асинхронные операции, вы должны:

  • подкласса NSOperation;

  • обязательно верните asynchronous имущество возвращается true; и

  • выполнить необходимые isExecuting и isFinished KVO.

Кроме того, при выполнении асинхронных операций, вы также должны:

  • реализации логики от отказа, что делает больше, чем просто флаг операция, как полное, но и останавливает любой запрос, который может быть в процессе.

Для примера параллельных/асинхронных операций с NSURLSession см. https://stackoverflow.com/a/27022598/1271826. Здесь также будут описаны принципы, изложенные здесь.

+0

Спасибо за ответ! – Kahsn

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