【发布时间】:2016-06-14 11:49:38
【问题描述】:
我正在与以下情况作斗争,请多多包涵,因为我已尝试尽可能清楚地解释这一点:
我有一个类 CoummintyOperation,它是 GroupOperation 的子类。调用CommuityOperation 并将其添加到NSOperationQueue。 CommunityOperation 反过来又调用了一大堆 NSOperation,它们也是 GroupOperation 的子类,反过来又在其中调用 NSoperations。 我在 CommunityOperation 类中添加了 GroupOperations 的依赖项。 我正在处理的问题是,如果嵌套操作失败,我需要取消 CommunityOperations 类中的所有 NSOperations,但我无权访问添加 CommunityOperation 的 operationQueue 以调用 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
])
}
}
DownloadGroupOperation 类又是 GroupOperation 的子类。它有两个操作 - 第一个是下载数据,第二个是解析数据:
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 在此方法的完成处理程序中:
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 有什么建议吗?
标签: ios swift nsoperation nsoperationqueue