0

特定のメソッドのデータを返す必要があるデリゲート クラスがあります。私の問題は、そのデータを取得するために行う呼び出しの一部が (完了ブロックを使用して) 非同期であるため、手元のデータを使用してメソッドから戻るのが難しいことです。これが私が思いついたものです:

- (NSArray *)contentsAtPath:(NSString *)path
{
    __block NSMutableArray *contentsArray = [NSMutableArray array];
    __block BOOL blockProcessing = YES;

    SuccessBlock success = ^(MyResult *result)
    {            
        for (NSUInteger i = 0; i < result.count; i++)
        {
            MyItem *item = [result objectAtIndex:i];
            [contentsArray addObject:item];
        }

        blockProcessing = NO;
    };

    [self.dataManager itemsAtPath:path success:success failure:nil];

    while (blockProcessing) {
        // wait for block to complete
    }

    return contentsArray;
}

while ループを使用せずにこれを達成するためのより良い方法はありますか?

4

1 に答える 1

2

もちろん。このようなものがうまくいくかもしれません:

- (NSArray *)contentsAtPath:(NSString *)path
{
    NSMutableArray *contentsArray = [NSMutableArray array];

    dispatch_semaphore_t sem = dispatch_semaphore_create(0);

    SuccessBlock success = ^(MyResult *result)
    {
        for (NSUInteger i = 0; i < result.count; i++)
        {
            MyItem *item = [result objectAtIndex:i];
            [contentsArray addObject:item];
        }

        dispatch_semaphore_signal(sem);
    };

    [self.dataManager itemsAtPath:path success:success failure:nil];

    dispatch_semaphore_wait(sem, DISPATCH_TIME_FOREVER);

    // If not ARC then
    // [sem release];

    return contentsArray;
}

contentsArrayまた、指定子を必要としないことに注意してください__block(少なくともここのコードでは)。

于 2013-09-19T15:22:06.403 に答える