这可能是一个天真的问题,但在我的加载ViewController中,我正在使用一组方法(如下面的getEachItem)加载应用程序所需的所有内容。这通常类似于2或3个项目,它们都写入缓存。我想打电话给方法' showNavigation'在getEachItem的最终实例完成后运行但不确定如何执行此操作。 getEachItem使用AFNetworking执行GET请求。类似于jQuery完整块的东西,但是对于循环
的全部内容NSArray *tmpItems=[result objectForKey:@"ipad_items"];
for(NSDictionary *m in tmpItems){
// will also increment into the _menus array
[self getEachItem:[m objectForKey:@"id"]];
[self getImages:[m objectForKey:@"id"]];
}
[self showNavigation];
thx任何帮助
答案 0 :(得分:4)
当您调用AFNetworking GET
方法时,它会返回AFHTTPRequestOperation
(NSOperation
子类)。您可以利用此事实为您的问题采用基于操作队列的解决方案。也就是说,您可以创建一个新的"完成操作"这取决于特定AFNetworking操作的完成情况。
例如,您可以更改getEachItem
方法,以返回AFHTTPRequestOperation
方法返回的GET
。例如,假设您的getEachItem
目前定义为:
- (void)getEachItem:(id)identifier
{
// do a lot of stuff
[self.manager GET:... parameters:... success:... failure:...];
}
将其更改为:
- (NSOperation *)getEachItem:(id)identifier
{
// do a lot of stuff
return [self.manager GET:... parameters:... success:... failure:...];
}
然后,您可以创建自己的完成操作,该操作将取决于所有其他AFHTTPRequestOperation
操作完成。因此:
NSOperation *completion = [NSBlockOperation blockOperationWithBlock:^{
[self showNavigation];
}];
NSArray *tmpItems=[result objectForKey:@"ipad_items"];
for(NSDictionary *m in tmpItems){
// will also increment into the _menus array
NSOperation *operation = [self getEachItem:[m objectForKey:@"id"]];
[completion addDependency:operation];
[self getImages:[m objectForKey:@"id"]];
}
[[NSOperationQueue mainQueue] addOperation:completion];
完成此操作后,completion
操作将不会触发,直到所有getEachItem
操作完成。请注意,当核心AFHTTPRequestOperation
对象完成时,将触发此完成操作,但无法保证这些请求的相应完成块必须完成。
另一种方法是使用GCD"组"。使用这种技术,你可以输入"当您提交每个请求时,您将离开"离开" GET
方法的完成块中的组。然后,您可以指定一个代码块,当该组通知您已离开该群组的次数与您输入的次数相同时(即所有AFNetworking网络请求及其success
} / failure
块,已完成)。
例如,向dispatch_group_t
添加getEachItem
参数:
- (void)getEachItem:(id)identifier group:(dispatch_group_t)group
{
dispatch_group_enter(group);
// do a lot of stuff
[self.manager GET:... parameters:... success:^(...) {
// do you success stuff and when done, leave the group
dispatch_group_leave(group);
} failure:^(...) {
// do you failure stuff and when done, leave the group
dispatch_group_leave(group);
}];
}
注意,你"输入"在提交请求之前,两个 success
和failure
块必须致电dispatch_group_leave
。
完成此操作后,您现在可以在请求循环中使用dispatch_group_t
,当群组收到通知表示已完成所有操作时执行showNavigation
:
dispatch_group_t group = dispatch_group_create();
NSArray *tmpItems=[result objectForKey:@"ipad_items"];
for(NSDictionary *m in tmpItems){
// will also increment into the _menus array
[self getEachItem:[m objectForKey:@"id"] group:group];
[self getImages:[m objectForKey:@"id"]];
}
dispatch_group_notify(group, dispatch_get_main_queue(), ^{
[self showNavigation];
});