iphone - 使用 addOperationWithBlock 将 block 添加到队列并使用完成 block

标签 iphone objective-c multithreading concurrency

我有一个包含 3 个步骤的流程。每一个都需要在另一个之前完成(同步、串行等)。所有这些都需要在后台完成,以免阻塞 UI。

我正在尝试重新设计一些东西以使用 2 个队列,一个用于网络操作,一个用于数据库更新以保护核心数据。在队列之间来回跳动,我可以让事情串行化,只需触发一个 block ,然后在它完成时调用它。

我正在使用 addOperationWithBlock 来创建操作并将其入队,但没有看到执行完成 block 的明显方法(例如我使用 setCompletionBlock 所做的)。完成后我不确定如何开始第 2 步。我是不是想太多了,我只是在第 1 步的 block 末尾调用下一个方法(第 2 步的起点)?问题是这些 block 内的东西可能像 AFNetworking 调用一样异步。

这里有一些代码和更多信息。我想访问服务器,获取数据,然后在完成时执行其他操作,但将它们链接起来,因此它必须按顺序从数据到验证步骤:

self.networkQueue = [NSOperationQueue new];
self.networkQueue.maxConcurrentOperationCount = 1;
self.databaseQueue = [NSOperationQueue new];
self.databaseQueue.maxConcurrentOperationCount = 1;

[self.networkQueue addOperationWithBlock:^{

        NSString *listURL = [NSString stringWithFormat:GET_LIST,BASE_URL];
        NSURL *url = [NSURL URLWithString:briefListURL];
        NSURLRequest *request = [NSURLRequest requestWithURL:url];

        AFJSONRequestOperation *operation = [AFJSONRequestOperation JSONRequestOperationWithRequest: request
                                                                                            success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) {
                                                                                                self.list = [NSArray arrayWithArray:(NSArray *)JSON];                                                                                                    
                                                                                            } failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, id JSON) {
                                                                                                [self listOperationDidFail];
                                                                                            }];

        // define block that will execute when the task is finished
        [operation setCompletionBlock:^{
            // Latest data retrieved. Check if db needs updating
            [self verifyList];
        }];

        [operation start];
    }];

最佳答案

这里真正的问题是队列中 block 的完成 block 中的异步过程。

这个食谱应该有帮助:

  1. 创建 NSOperationQueue 实例。设置 maxConcurrentOperationCount = 1。

  2. 声明所有 block 进程及其完成 block 。放在那里任何你想要的东西。在每个 block 进程的开始,放置一段暂停创建的 NSOperationQueue 的代码。在每个 block 的完成 block 的末尾,放置一段取消挂起相同队列的代码 - 如果您在 block 或其完成 block 内调用异步进程,则需要在该异步进程的末尾放置/调用该取消挂起代码。

  3. 将所有 block 添加到 NSOperationQueue。

您还可以通过将每个进程嵌套在其他进程完成 block 中来完成工作。

关于iphone - 使用 addOperationWithBlock 将 block 添加到队列并使用完成 block ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18837849/

相关文章:

javascript - 使用 Phonegap 为 iPhone 生成 PDF

iphone - 修复了 UITableView 中的透明标题

iphone - 将 kABPersonBirthdayProperty 保存到通讯录没有一年?

objective-c - 用于从 Cocoa 应用程序浏览 zip 文件的库

c++ - 通过队列的多线程互斥

iphone - 将 Cocos2D View 合并到现有的选项卡应用程序中

ios - 在 Swift 中使用图像时内存泄漏?

ios - 在 IOS 上使用 SOAP

c++ - Qt 线程中未检测到信号和插槽

c# - Int64(长整型)和线程安全