ios - 向NSOperation发送数据还是应该使用NSThread?

时间:2013-08-28 12:13:00

标签: ios concurrency

我有通过HTTP创建/更新的核心数据对象。我还想创建一个后台线程来连续从应用程序接收时间戳和状态信息并更新核心数据对象。我应该使用NSOperation或GCD吗?因为它不仅仅是一个简单的任务,NSOperation似乎更好,因为我可以在其中循环,但我无法弄清楚如何在主线程运行时将信息传递给操作。有一个简单的方法吗?我已经看过许多关于从操作向主线程发送消息的线程/文章,但没有关于向它传递消息的信息。

使用NSOperation / GCD似乎是一个很好的解决方案吗?

2 个答案:

答案 0 :(得分:0)

退后一步,重新审视您的架构。您应该使用自身使用私有调度队列的托管对象上下文(选项NSPrivateQueueConcurrencyType)。

然后,您将使用NSURLConnections获取所需的数据,当您在委托方法中获取数据时,您可以使用performBlock异步更新存储库。

相反,您可能希望使用performBlockAndWait检索数据,使用块变量或可变预定义对象来接收块中的结果。

答案 1 :(得分:0)

我看到这一切都错了(基本上想要子类化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
        }
    }
});