2

私は他のいくつかの方法を実行する方法を持っています。これらには完了ブロックがあります。各サブメソッドから結果が得られたら、メインメソッドの最後に値を返したいだけです。例:

-(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);
    });
}
4

3 に答える 3

-2

ブロックがいつ返されるかわからないので、その時点でデータがあるかどうかわかりません。私が提案する場合は、それらのブロックでメソッドを呼び出すことをお勧めします。そのメソッドは、両方の辞書が設定されているかどうかを確認しますそうである場合はプロセスを続行し、そうでない場合は続行しないでください

- (void)mainMethod
{
    [self subMethod1Complete:^(NSMutableArray *results)
    {
        self.result1 = results;
        [self method3];
    }

    [self subMethod2Complete:^(NSMutableArray *results)
    {
       self.results2 = results;
       [self method3];
    }

}

- (void)method3 {
    if ( self.results1 != nil && self.results2 != nil ) {
         [self startProcedure];
    } else {
         // do nothing
    }

}

まとめて、これを別の方法で行うようにコードを作り直すことをお勧めしますが、単にブロックの1つが返されるまでに完了することを保証できないためです。

このようなこともできます

-(NSMutableDictionary *)mainMethod
{
    [self subMethod1Complete:^(NSMutableArray *results)
    {

    }

    [self subMethod2Complete:^(NSMutableArray *results)
    {

    }
    while(result == nil)
      sleep(1);

        //return...
    }

これも本当に悪いことです....コードを書き直したほうがいいです

于 2013-07-16T17:04:35.140 に答える