在objective-c中可以在一组其他方法执行完毕后调用方法

时间:2014-08-23 20:11:12

标签: ios objective-c block afnetworking afnetworking-2

这可能是一个天真的问题,但在我的加载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任何帮助

1 个答案:

答案 0 :(得分:4)

当您调用AFNetworking GET方法时,它会返回AFHTTPRequestOperationNSOperation子类)。您可以利用此事实为您的问题采用基于操作队列的解决方案。也就是说,您可以创建一个新的"完成操作"这取决于特定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);
    }];
}

注意,你"输入"在提交请求之前,两个 successfailure块必须致电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];
});