我有通过 HTTP 创建/更新的核心数据对象。我还想创建一个后台线程来不断地从应用程序接收时间戳和状态信息并更新核心数据对象。我应该为此使用 NSOperation 还是 GCD?由于这不仅仅是一个简单的任务,NSOperation 似乎更好,因为我可以在其中循环,但我不知道如何在运行时从主线程将信息传递给操作。有没有一种简单的方法可以做到这一点?我看过很多关于从操作向主线程发送消息的线程/文章,但没有关于将消息传递给它的内容。
使用 NSOperation/GCD 似乎是一个好的解决方案吗?
我有通过 HTTP 创建/更新的核心数据对象。我还想创建一个后台线程来不断地从应用程序接收时间戳和状态信息并更新核心数据对象。我应该为此使用 NSOperation 还是 GCD?由于这不仅仅是一个简单的任务,NSOperation 似乎更好,因为我可以在其中循环,但我不知道如何在运行时从主线程将信息传递给操作。有没有一种简单的方法可以做到这一点?我看过很多关于从操作向主线程发送消息的线程/文章,但没有关于将消息传递给它的内容。
使用 NSOperation/GCD 似乎是一个好的解决方案吗?
我在看这一切都是错误的(本质上是想继承 NSThread 并将数据传递给/从它)。我没有考虑适当地使用块。
本质上,我正在做的是:
loadStuff:(NSDictionary *)stuff {
// stuff is data from HTTP GET request
NSManagedObjectContext *context = // init context with NSPrivateQueueConcurrencyType
context.parentContext = // main context
[context performBlock:^{
// insert/update entities
// save context
}];
}
但随后我需要在后台线程中循环以更新实体:
//inside some method
dispatch_async(global_queue, ^{
// _currentTimestamp is updated by a delegate
NSInterval timestamp = _currentTimestamp;
while (run) {
if (timestamp != _currentTimestamp) {
// do calculation
// update entities if needed
// save context
}
}
});
退后一步,重新审视您的架构。您应该使用托管对象上下文,该上下文本身使用私有调度队列(选项 NSPrivateQueueConcurrencyType)。
然后,您将使用 NSURLConnections 来获取您想要的数据,并且当您在委托方法中获取数据时,您可以使用performBlock.
相反,您可能希望使用performBlockAndWait、 使用块变量或可变的预定义对象来检索数据,以接收来自块的结果。