我有一种方法可以运行其他几种方法。这些有完成块,我只想在我的每个子方法得到结果后在我的主方法结束时返回一个值。例子:
-(NSMutableDictionary *)mainMethod
{
[self subMethod1Complete:^(NSMutableArray *results)
{
}
[self subMethod2Complete:^(NSMutableArray *results)
{
}
//return...
}
一旦两个子方法完成,我只想在最后返回我的字典。我怎样才能做到这一点?
我确实有为每个方法存储一个 BOOL 的想法,所以我知道,不完整,是完整的。所以当两者都是YES时,我返回我的字典。但是我怎么能按时而不是过早地调用它呢?
更新
我已经调整了我的代码以使用完成块,因此当我最终从其他方法接收来自另外两个完成块的数据时,我运行带有编译结果的最后一个。下面你可以看到我的方法。你可以在下面看到我的方法,到目前为止没有成功,最终的完成块仍然被过早地调用。
对我来说很重要的一点。getTitles
和getThumbnails
方法。在这些的完成块中,我得到了我需要的数据。只有当我拥有这两个时,我才想调用这个 main 方法的最终完成块。因此,一旦收到标题和缩略图,它将传递它们。
-(void)getFeedForUserID:(NSString *)channelID delegate:(id<YTHelperDelegate>)delegate complete:(void (^)(NSMutableDictionary * result))completionBlock properties:(NSString *)element, ...
{
va_list args;
va_start(args, element);
NSMutableArray *array = [NSMutableArray new];
for (NSString *arg = element; arg != nil; arg = va_arg(args, NSString *)) [array addObject:arg];
va_end(args);
NSMutableDictionary *resultsDict = [NSMutableDictionary new];
dispatch_queue_t queue = dispatch_get_global_queue(0, 0);
dispatch_group_t group = dispatch_group_create();
for (NSString *string in array)
{
if ([string isEqualToString:kFeedElementTitle])
{
dispatch_group_async(group, queue, ^{
[self getTitlesArrayForChannel:channelID completionHandler:^(NSMutableArray *results) {
dispatch_group_async(group, dispatch_get_main_queue(), ^{
[resultsDict setObject:results forKey:kFeedElementTitle];
});
}];
});
}
if ([string isEqualToString:kFeedElementTitle])
{
dispatch_group_async(group, queue, ^{
[self getThumbnailsArrayForChannel:channelID completionHandler:^(NSMutableArray *results) {
dispatch_group_async(group, dispatch_get_main_queue(), ^{
[resultsDict setObject:results forKey:kFeedElementThumbnail];
});
}];
});
}
}
dispatch_group_notify(group, dispatch_get_main_queue(), ^{
completionBlock(resultsDict);
});
}