gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-30 20:18:51 25 4
gpt4 key购买 nike

我有一个包含 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/

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