需要从以相同方法调用的完成块返回数据

时间:2013-09-19 15:13:47

标签: objective-c cocoa objective-c-blocks

我有一个委托类需要返回某些方法的数据。我的问题是我为获取该数据而进行的一些调用是异步的(使用完成块),因此很难从包含数据的方法返回。以下是我提出的建议:

- (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循环的情况下实现这一目标?

1 个答案:

答案 0 :(得分: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说明符(至少对于此处的代码而言)。