2015-09-10 5 views
4

Я начал работать с CloudKit и, наконец, начал использовать подклассы NSOperation для большинства моих асинхронных файлов.NSOperations, зависимости и неудачные операции

Как бы то ни было, у меня есть два вопроса.

  1. Как я могу отметить операцию как не выполненную? То есть, если операция A терпит неудачу, я не буду запускать ее зависимые операции. Могу ли я просто отметить его как isFinished? Что происходит с неисполненными элементами уже в очереди?

  2. Что было бы рекомендуемым маршрутом, если бы я хотел что-то вроде попытки, поймать, наконец. Конечная цель состоит в том, чтобы иметь одну последнюю операцию, которая может отображать некоторый пользовательский интерфейс с информацией об успехе или сообщить об ошибках пользователю?

ответ

1

isFinished означает, что ваши операции полное выполнение, вы можете отменить операцию, но это означает, что ваша операция отменяется, и это может быть сделано даже без выполнения операции, и вы можете проверить, что по телефону isCanceled, если вы хотите specicically недостаточность и флаги успеха после выполнения NSOpeartion, а затем в подклассе добавьте свойство isFailure и проверьте зависимую операцию перед выполнением и отмените это, если isFailure установлено в true.

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

Обновление Вы можете хранить и массивы зависимых операций, а при сбое вы можете отменить эти операции.

+0

Хорошо, спасибо. Таким образом, лучший способ - сохранить ссылку на каждую операцию проверки нового свойства isFailure для всех из них и отобразить разные сообщения в зависимости от его значения? –

+0

Возможно, вы можете сохранить ссылку на зависящие от вас операции, а когда она не удалась или отменилась, вы можете отменить их. –

0
  1. Добавить операции в очередь. Когда один из них не выполняет отмену вызова в очереди. Будущие CKOperations будут ошибочно начинаться с того, что «операция была отменена до ее запуска», и любые операции с блоками даже не будут выполняться.

  2. Один из способов - использовать KVO в операции очереди (Example on Github) и дождаться нулевого значения. Затем, если вы получили ошибку на любом этапе (и захватили ее), вы можете сделать окончательную операцию обратного вызова, завершенную с ошибкой. Однако, как правило, вы в конечном итоге хотите отображать другое сообщение в зависимости от операции, вызвавшей ошибку, и в этом случае лучше всего обрабатывать их, когда они происходят, а не ждать до конца, когда вам нужно выяснить, какая ошибка пришла с этой операции.

0

Обзор:

  • Когда операция терпит неудачу (на основе бизнес-логики), и вы хотите, чтобы отменить все зависимые операции, то вы можете отменить зависимые операции вручную

  • Заказать в котором вы отменяете операцию, важно, поскольку отмена операции позволит запускать зависимые операции (поскольку условие зависимости было нарушено).

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

Код:

var number = 0 

let queue = OperationQueue() 

let b = BlockOperation() 
let c = BlockOperation() 
let d = BlockOperation() 

let a = BlockOperation { 

    if number == 1 { 

     //Assume number should not be 1 
     //If number is 1, then it is considered as a failure 

     //Cancel the remaining operations manually in the reverse order 
     //Reverse order is important because if you cancelled b first, it would start c 
     d.cancel() 
     c.cancel() 
     b.cancel() 
    } 
} 

b.addDependency(a) 
c.addDependency(b) 
d.addDependency(c) 

queue.addOperation(a) 
queue.addOperation(b) 
queue.addOperation(c) 
queue.addOperation(d)