在两个 NSOperations 之间传递数据

Passing Data Between Two NSOperations

我非常关注关于 Advanced NSOperations and I played a little bit with the example code 的 WWDC 2015 会议。

提供的抽象真的很棒,但有些东西我可能不太理解。

我想在不使用 MOC 的情况下在两个后续操作子类之间传递结果数据。

假设我有一个 APIQueryOperation,它有一个 NSData? 属性 和第二个操作 ParseJSONOperation 使用这个 属性。我如何将这个 NSData? 实例提供给第二个操作?

我试过这样的事情:

queryOperation = APIQueryOperation(request: registerAPICall)  
parseOperation = ParseJSONOperation(data: queryOperation.responseData)  
parseOperation.addDependency(queryOperation) 

但是当我输入 ParseJSONOperationexecute 方法时,实例与初始化程序中的实例不同。

我做错了什么?

您的问题是您正在使用 nil 值构建 ParseJSONOperation。由于您有两个依赖此 NSData 对象的操作,我建议您编写一个包装器对象来容纳此数据。

为了尝试与 WWDC 谈话保持一致,让我们将此对象称为 APIResultContext:

class APIResultContext {
    var data: NSData?
}

现在我们可以将此对象传递给 APIQueryOperationParseJSONOperation,这样我们就有了一个有效的对象来存储从 API.[=20 传输的数据=]

这将使查询的构造函数:

let context = APIResultContext()
APIQueryOperation(request: registerAPICall, context: context)
ParseJSONOperation(context: context)  

在您的 ParseJSONOperation 中,假设查询在设置数据后完成,您应该能够访问数据。

线程安全

正如@CouchDeveloper 指出的那样,data 严格来说不是线程安全的。对于这个简单的例子,因为这两个操作是相关的,我们可以安全地写入和读取,因为知道这些访问不会同时发生。然而,为了解决方案并使上下文线程安全,我们可以添加一个简单的 NSLock

class APIResultContext {
    var data: NSData? {
        set {
            lock.lock()
            _data = newValue
            lock.unlock()
        }
        get {
            lock.lock()
            var result =  _data
            lock.unlock()
            return result
        }
    }

    private var _data: NSData?
    private let lock = NSLock()
}