私は他のいくつかの方法を実行する方法を持っています。これらには完了ブロックがあります。各サブメソッドから結果が得られたら、メインメソッドの最後に値を返したいだけです。例:
-(NSMutableDictionary *)mainMethod
{
[self subMethod1Complete:^(NSMutableArray *results)
{
}
[self subMethod2Complete:^(NSMutableArray *results)
{
}
//return...
}
2 つのサブメソッドが完了したら、最後に辞書を返したいだけです。これどうやってするの?
私はメソッドごとに BOOL を格納するという考えを持っていました。したがって、両方が YES の場合、dict を返します。しかし、時期尚早ではなく、時間通りに呼び出すにはどうすればよいでしょうか。
アップデート
完了ブロックを使用するようにコードを微調整したので、最終的に他のメソッドから他の 2 つの完了ブロックからデータを受け取ったときに、コンパイルされた結果で最後のブロックを実行します。以下に私の方法を示します。以下の私の方法を見ることができます。これまでのところ成功していません。最終的な完了ブロックはまだ時期尚早に呼び出されています。
私にとって重要なビット。getTitles
およびgetThumbnails
方法。これらの完了ブロックで、必要なデータを取得します。これらの両方がある場合にのみ、このメイン メソッドの最後の完了ブロックを呼び出します。その結果、受信したタイトルとサムネイルの両方が渡されます。
-(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);
});
}