1
我目前正在尝试使用WWDC期间介绍的有关Advanced NSOperations的概念。我想分开使用不同Operation
子类(以及任何类型的链式操作)的请求过程。高级NSOperations,GroupOperation的回调
我使用上下文类共享所有参与这一过程的操作之间的数据(见:Passing Data Between Two NSOperations)initalization期间
class RequestContext {
var httpResponse:NSHTTPURLResponse?
var data:NSData?
var JSON:AnyObject?
}
每个子类去上下文的参考。
例下载:
class DownloadOperation : GroupOperation {
let requestContext:RequestContext
init(context:RequestContext, apiCall:API){
requestContext = context
super.init(operations: [])
name = "Generic Download"
guard let URL = apiCall.URLRequest else {
finish()
return
}
let dataTask = NSURLSession.sharedSession().dataTaskWithURL(URL) {
data, response, error in
self.downloadFinished(data, response: response as? NSHTTPURLResponse, error: error)
}
let downloadTask = URLSessionTaskOperation(task: dataTask)
let reachabilityCondition = ReachabilityCondition(host: URL)
let networkObserver = NetworkObserver()
downloadTask.addCondition(reachabilityCondition)
downloadTask.addObserver(networkObserver)
addOperation(downloadTask)
}
private func downloadFinished(data:NSData?, response:NSHTTPURLResponse?, error:NSError?){
if let data = data {
requestContext.data = data
requestContext.httpResponse = response
} else {
finishWithError(error)
}
}
}
例JSON解析:
class JSONUnmarshallOperation: Operation {
let context:RequestContext
init(context c:RequestContext){
self.context = c
super.init()
name = "JSON Parsing"
}
final override func execute() {
guard let data = context.data else { finish(); return }
defer {
context.data = nil
}
do {
context.JSON = try NSJSONSerialization.JSONObjectWithData(data, options: [])
finish()
} catch let error as NSError {
finishWithError(error)
}
}
}
我希望能够创建一个GroupOperation
依靠这两种操作并定义一个完成回调。我想有这样的事情:
class SomeOperation: GroupOperation {
let downloadOperation:DownloadOperation
let unmarshalOperation:JSONUnmarshallOperation
init (completionHandler:<* Some Type *>) {
let blockOperation = NSBlockOperation {
//Use the callback here and access self
}
super.init(operations:[downloadOperation, unmarshalOperation, blockOperation])
}
}
这里的问题是,我会打电话super.init
之前访问self
是否有一个简单而优雅的方式来增加一个通用完成处理程序添加结束GroupOperation
的子类?