Я борющиеся со следующей ситуацией, Pleaes, медведь со мной, как я пытался объяснить это быть как можно более четко:призывающего cancelAllOperations от вложенных NSOperations
У меня есть класс CoummintyOperation который является подклассом GroupOperation. CommuityOperation вызывается и добавляется в NSOperationQueue. CommunityOperation, в свою очередь, вызывает целую группу NSOperations, которые также являются подклассами GroupOperation и, в свою очередь, вызывают NSoperations внутри них. Я добавил зависимости для GroupOperations в классе CommunityOperation. Проблема, с которой я столкнулся, заключается в том, что если вложенная операция не удалась, мне нужно отменить все NSOperations в классе CommunityOperations, но у меня нет доступа к операцииQueue, к которой была добавлена CommunityOperation, чтобы вызвать метод cancelAllOperations.
Может ли кто-нибудь помочь мне и объяснить, как я могу назвать этот метод, отмените все операции этого класса (и, следовательно, все вложенные операции) и выведете пользователю сообщение об ошибке.
Заранее спасибо
Вот некоторые примеры кода, чтобы помочь объяснить мою проблему: CommunityOperation получает положенным на operationQueue из другого класса (не входит в комплект)
public class CommunityOperation: GroupOperation {
var updateOperation: UpdateOperation!
var menuOperation: MenuOperation!
var coreDataSaveOperation: CoreDataSaveOperation!
var hasErrors = false
public init() {
super.init(operations: [])
updateOperation = UpdateOperation()
menuOperation = MenuOperation()
coreDataSaveOperation = CoreDataSaveOperation()
coreDataSaveOperation.addDependencies([updateOperation, menuOperation])
self.addOperation(updateOperation)
self.addOperation(menuOperation)
self.addOperation(coreDataSaveOperation)
}
}
MenuOperation класса, который вложен операций в это также:
class UpdateMenuOperation: GroupOperation {
let downloadGroupsOperation: DownloadGroupsOperation
let downloadMembersOperation: DownloadMembersOperation
init() {
downloadGroupsOperation = DownloadGroupsOperation()
downloadMembersOperation = DownloadMembersOperation(])
super.init(operations: [downloadGroupsOperation,
downloadMembersOperation
])
}
}
Загрузить класс GroupOperation снова является подклассом GroupOperation. Он имеет 2 операции - первая для загрузки данных и второй для анализа данных:
class DownloadTopGroupsOperation: GroupOperation {
let downloadOperation: DownloadOperation
let importTopGroupsOperation: ImportOperation
init() {
downloadOperation = DownloadOperation()
importOperation = ImportOperation()
importOperation.addDependency(downloadOperation)
importOperation.addCondition(NoCancelledDependencies())
super.init(operations: [downloadOperation, importOperation])
}
}
И, наконец (Уф) класс DownloadOperation использует NSURLSession, и метод downloadTaskWithURL
, то в обработчике завершения этого метода, что я хочу называть cancelAllOperations на главной operatioQueue, если возвращается ошибка:
class DownloadOperation: GroupOperation {
init() {
super.init(operations: [])
if self.cancelled {
return
}
let task = session.downloadTaskWithURL(url) { [weak self] url, response, error in
self?.downloadFinished(url, response: response as? NSHTTPURLResponse, error: error)
}
}
func downloadFinished(url: NSURL?, response: NSHTTPURLResponse?, error: NSError?) {
if error {
*cancel allOperations on queue*
}
}
}
Исходный код поможет. Можете ли вы привести краткий пример того, что вы делаете? – Dominic
@ Dominic любые предложения? – mrcurious