我有一个包含 3 个步骤的过程。每个都需要在另一个之前完成(同步、串行等)。所有这些都需要在后台完成,以免阻塞 UI。
我正在尝试重新架构一些东西以使用 2 个队列,一个用于网络操作,一个用于数据库更新以保护核心数据。在队列之间来回弹跳,我可以让事情保持连续,只需启动一个块,然后在它完成时调用它。
我正在使用 addOperationWithBlock 来创建操作并将其排入队列,但看不到执行完成块的明显方法(例如我使用 setCompletionBlock 所做的)。完成后,我不确定如何开始第 2 步。我是不是想多了,我只是在步骤 1 的块末尾调用下一个方法(步骤 2 的起点)?问题是这些块内的东西可能像 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];
}];