2017-02-14 14 views
3

Ссылаясь https://developer.apple.com/reference/foundation/operation, я имею установку Playground, как -Понимание последовательности операций с зависимостью в Swift

class myOperation1 : Operation { 
    override func main() { 
     print("op1 working....") 
    } 
} 

class myOperation2 : Operation { 
    override func main() { 
     print("op2 working....") 
    } 
} 

let op1 = myOperation1() 
let op2 = myOperation2() 

op1.completionBlock = { 
    print("op1 finished") 
} 

op2.completionBlock = { 
    print("op2 finished") 
} 

op2.addDependency(op1) 

let opsQue = OperationQueue() 
opsQue.addOperation(op1) 
opsQue.addOperation(op2) 

И лог консоли -

op1 working.... 
op2 working.... 
op1 finished 
op2 finished 

Не следует ли нам ожидать выхода в результате зависимости ? -

op1 working.... 
op1 finished 
op2 working.... 
op2 finished 

Тот же результат с помощью - opsQue.addOperations([op1, op2], waitUntilFinished: true)

op1 working.... 
op2 working.... 
op1 finished 
op2 finished 
+1

Чтобы избежать кодового заказа, вы можете использовать 'opsQue.addOperations ([op1, op2], waitUntilFinished: true) ' – WeiJay

+0

и попробуйте с зависимостью и без зависимости – WeiJay

+0

@WeiJay: Возможно, я не должен наблюдать за этим поведением на Playground, в фактическом проекте он должен работать как ожидалось – BaSha

ответ

2

В самом деле, я не могу определить, что это именно тайна, почему ваш код не работает, как это должно, но я понял, 3 обходные пути, чтобы достичь того, что вы пытаетесь:

Если вы ждете, что выход должен всегда быть:

op1 working.... 
op1 finished 
op2 working.... 
op2 finished 

затем:

1- Вы можете добавить вторую операцию в очередь в завершение блока первого, следующим образом:

class myOperation1 : Operation { 
    override func main() { 
     print("op1 working....") 
    } 
} 

class myOperation2 : Operation { 
    override func main() { 
     print("op2 working....") 
    } 
} 

let opsQue = OperationQueue() 

let op1 = myOperation1() 

op1.completionBlock = { 
    print("op1 finished") 

    opsQue.addOperation(op2) 
} 

let op2 = myOperation2() 

op2.completionBlock = { 
    print("op2 finished") 
} 

opsQue.addOperation(op1) 

2- Настройка maxConcurrentOperationCount:

class myOperation1 : Operation { 
    override func main() { 
     print("op1 working....") 
    } 
} 

class myOperation2 : Operation { 
    override func main() { 
     print("op2 working....") 
    } 
} 

let op1 = myOperation1() 
let op2 = myOperation2() 

op1.completionBlock = { 
    print("op1 finished") 
} 

op2.completionBlock = { 
    print("op2 finished") 
} 

op2.addDependency(op1) 

let opsQue = OperationQueue() 
// setting maxConcurrentOperationCount to 1 
opsQue.maxConcurrentOperationCount = 1 
opsQue.addOperation(op1) 
opsQue.addOperation(op2) 

3- Вызов waitUntilAllOperationsAreFinished() после добавления первой операции в очереди, следующим образом:

let opsQue = OperationQueue() 
opsQue.addOperation(op1) 
opsQue.waitUntilAllOperationsAreFinished() 
opsQue.addOperation(op2) 

Кстати, для не сложной задачей, Я предпочитаю использовать ГКД.

Надеюсь, это помогло.

0

Задавая зависимость, это гарантирует, что op2 получает планируется после op1 завершается, но не обязательно, что op2 получает планируется после того, как обработчик завершения op1 закончил.

+0

Я думаю, что утверждение противоречит - приемник не считается готовым к выполнению, пока все его зависимые операции не завершили выполнение (https://developer.apple.com/reference/foundation/operation/1412859-adddependency) – BaSha

+0

@BaSha: что вы имеете в виду? Где вы видите противоречие? 'addDependency' добавляет зависимость от операции, а не от обработчика завершения ... – Tali

0

Инициализация операции приостановлена, даст вам то, что вы хотите.

let queue = OperationQueue() 
let downloadOp = Operation() 
let resizeOp = Operation() 
downloadOp.dependency(resizeOp) 
queue.isSuspended = true 
queue.addOperation(downloadOp) 
queue.addOperation(resizeOp) 
queue.isSuspended = false 

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

  • Нет связанных вопросов^_^