我有一个委托类需要返回某些方法的数据。我的问题是我为获取该数据而进行的一些调用是异步的(使用完成块),因此很难从包含数据的方法返回。以下是我提出的建议:
- (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循环的情况下实现这一目标?
答案 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
说明符(至少对于此处的代码而言)。