gpt4 book ai didi

objective-c - 需要从同一方法中调用的完成 block 返回数据

转载 作者:行者123 更新时间:2023-12-03 17:40:06 26 4
gpt4 key购买 nike

我有一个委托(delegate)类,需要为某些方法返回数据。我的问题是,我为获取数据而进行的一些调用是异步的(使用完成 block ),因此很难从带有手头数据的方法返回。这是我想到的:

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

最佳答案

当然。像这样的东西可能会起作用:

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

关于objective-c - 需要从同一方法中调用的完成 block 返回数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18898532/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com