2015-10-26 16 views
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的子类?

回答

3

简单的答案是不构建您的blockOperation后才你叫super.init

init (completionHandler:<* Some Type *>) { 
    let downloadOperation = ... 
    let unmarshallOperation = ... 
    unmarshallOperation.addDependency(downloadOperation) 

    super.init(operations:[downloadOperation, unmarshallOperation, blockOperation]) 

    let blockOperation = NSBlockOperation { 
     //Use the callback here and access self 
    } 
    blockOperation.addDependency(unmarshallOperation) 
    addOperation(blockOperation) 
}