在两个 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)
但是当我输入 ParseJSONOperation
的 execute
方法时,实例与初始化程序中的实例不同。
我做错了什么?
您的问题是您正在使用 nil 值构建 ParseJSONOperation
。由于您有两个依赖此 NSData
对象的操作,我建议您编写一个包装器对象来容纳此数据。
为了尝试与 WWDC 谈话保持一致,让我们将此对象称为 APIResultContext:
class APIResultContext {
var data: NSData?
}
现在我们可以将此对象传递给 APIQueryOperation
和 ParseJSONOperation
,这样我们就有了一个有效的对象来存储从 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()
}
我非常关注关于 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)
但是当我输入 ParseJSONOperation
的 execute
方法时,实例与初始化程序中的实例不同。
我做错了什么?
您的问题是您正在使用 nil 值构建 ParseJSONOperation
。由于您有两个依赖此 NSData
对象的操作,我建议您编写一个包装器对象来容纳此数据。
为了尝试与 WWDC 谈话保持一致,让我们将此对象称为 APIResultContext:
class APIResultContext {
var data: NSData?
}
现在我们可以将此对象传递给 APIQueryOperation
和 ParseJSONOperation
,这样我们就有了一个有效的对象来存储从 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()
}