将NSOperation的结果传递给另一个NSOperation

Kyl*_*cot 26 nsoperation ios swift ios9

我有两个NSOperation负责下载和解析.下载操作成功后,我收到一些NSData,然后我想将该数据设置为解析操作使用的数据:

init(context: NSManagedObjectContext, completionHandler: Void -> Void) {

    downloadOperation = DownloadActivitiesOperation() { data in
        self.parseOperation.data = data
    }
    parseOperation = ParseActivitiesOperation(context: context)

    let finishOperation = NSBlockOperation(block: completionHandler)

    parseOperation.addDependency(downloadOperation)
    finishOperation.addDependency(parseOperation)

    super.init(operations: [downloadOperation, parseOperation, finishOperation])

    name = "Get Activities"
}
Run Code Online (Sandbox Code Playgroud)

然而,这不起作用,因为我self在调用之前尝试在我的下载完成块中使用super.init.

我的问题是,当尝试将一个操作的结果传递给链中的下一个操作时,最好的方法是什么?

ily*_*lya 18

每个实例都NSOperation包含依赖项数组.完成后,不会从此阵列中删除操作.您可以使用这些对象来访问数据:

class DownloadActivitiesOperation: NSOperation {
   var data: NSData?
   ...
   // set self.data when it has downloaded
}

class ParseActivitiesOperation: NSOperation {
    func main() {
      if let downloadOp = self.dependencies.last as? DownloadActivitiesOperation {
          let dataToParse = downloadOp.data
          ...
      }
    }
 }
Run Code Online (Sandbox Code Playgroud)

等等.


tid*_*eck 7

使用文件缓存

看起来您正在使用GroupOperationWWDC2015 高级NSOperations上的某种实现方式.在谈话的示例代码中,他们使用缓存文件在下载程序和解析器之间传递数据.

以下片段摘录GetEarthquakesOperation:

    
        let cachesFolder = try! NSFileManager.defaultManager().URLForDirectory(.CachesDirectory, inDomain: .UserDomainMask, appropriateForURL: nil, create: true)

        let cacheFile = cachesFolder.URLByAppendingPathComponent("earthquakes.json")

        /*
            This operation is made of three child operations:
            1. The operation to download the JSON feed
            2. The operation to parse the JSON feed and insert the elements into the Core Data store
            3. The operation to invoke the completion handler
        */
        downloadOperation = DownloadEarthquakesOperation(cacheFile: cacheFile)
        parseOperation = ParseEarthquakesOperation(cacheFile: cacheFile, context: context)

使用内存缓存

我在我的一个项目中的当前解决方案是将结果包装在一个类中并将其传递给两个操作:


class OperationResultWrapper<T> {
    var result: T?
}


    let wrapper = OperationResultWrapper<NSData>()
    downloadOperation = DownloadEarthquakesOperation(resultWrapper: wrapper)
    parseOperation = ParseEarthquakesOperation(dataWrapper: wrapper, context: context)