在两个NSOperations之间传递数据

时间:2015-10-19 15:21:01

标签: swift nsoperation

我非常关注WWDC 2015关于Advanced NSOperations的会议,我和example code进行了一些讨论。

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

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

想象一下,我有APIQueryOperation具有NSData?属性,第二个操作ParseJSONOperation使用此属性。如何将此NSData?意图提供给第二个操作?

我试过这样的事情:

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

但是,当我输入execute实例的ParseJSONOperation方法时,与初始化工具中的方法不同。

我做错了什么?

1 个答案:

答案 0 :(得分:7)

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

要尝试与WWDC对话,请将此对象称为APIResultContext:

class APIResultContext {
    var data: NSData?
}

现在我们可以将此对象传递到APIQueryOperationParseJSONOperation,以便我们拥有一个可以存储从API传输的数据的有效对象。

这将构成查询的构造函数:

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()
}