我非常关注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
方法时,与初始化工具中的方法不同。
我做错了什么?
答案 0 :(得分:7)
您的问题是您正在使用零值构建ParseJSONOperation
。由于您有两个依赖于此NSData
对象的操作,我建议您编写一个包装器对象来存放此数据。
要尝试与WWDC对话,请将此对象称为APIResultContext:
class APIResultContext {
var data: NSData?
}
现在我们可以将此对象传递到APIQueryOperation
和ParseJSONOperation
,以便我们拥有一个可以存储从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()
}