gpt4 book ai didi

swift - 在两个 NSOperations 之间传递数据

转载 作者:搜寻专家 更新时间:2023-11-01 05:53:48 25 4
gpt4 key购买 nike

我非常关注关于 Advanced NSOperations 的 WWDC 2015 session 我玩了一点 example code .

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

我想在不使用 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 传输的数据。

这将使查询的构造函数:

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

关于swift - 在两个 NSOperations 之间传递数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33218159/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com