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 回答