gpt4 book ai didi

iphone - 如何等待异步方法结束?

转载 作者:行者123 更新时间:2023-12-03 13:14:50 26 4
gpt4 key购买 nike

我有一个需要使用的工具包(与远程服务交互)。该工具包查询远程服务并询问结果。它异步执行此操作,在大多数情况下这很好,但不适用于创建简洁的方法。我想做类似于以下的方法:

-(NSArray *)getAllAccounts {
NSString *query = @"SELECT name FROM Account";
//Sets "result" to the query response if no errors.
//queryResult:error:context: is called when the data is received
[myToolkit query:query target:self selector:@selector(queryResult:error:context:) context:nil];

//Wait?

return result.records;
}

问题是,在工具包内部,方法使用@selector 相互调用,而不是直接调用,因此很难获取返回值。此外,实际查询使用:
NSURLConnection *connection = [[[NSURLConnection alloc] initWithRequest:aRequest delegate:self] autorelease];

这是异步的。当从服务接收到数据时,我的方法很久以前就返回了……没有信息。所以我的问题是:有没有办法暂停执行直到数据返回?我可以在主线程休息时使用第二个线程来获取数据(或使用3个​​线程所以主线程不休息吗?)

我不想编辑工具包来改变他们的方法(或添加一个新的)是同步的,那么有没有办法让我想要的方法?

最佳答案

您可能要考虑不要让它全部同步,特别是如果您帖子中的示例代码在您的主应用程序线程上运行。如果这样做,主线程将阻塞 UI,应用程序将停止响应,直到远程事务完成。

因此,如果你真的坚持同步方法,那么你绝对应该在后台线程中进行,这样 UI 才不会变得无响应,这实际上会导致你的 App 被 iphone 上的操作系统杀死。

要在后台线程中完成这项工作,我强烈建议使用 Grand Central Dispatch 的东西,即 NSBlockOperation。它将使您不必实际创建和管理线程,并使您的代码非常整洁。

要执行同步操作,请查看 NSCondition 类文档。您可以执行以下操作:

NSCondition* condition = ...;
bool finished = NO;

-(NSArray *)getAllAccounts {
[condition lock];
NSString *query = @"SELECT name FROM Account";
//Sets "result" to the query response if no errors.
//queryResult:error:context: is called when the data is received
[myToolkit query:query target:self selector:@selector(queryResult:error:context:) context:nil];

while (!finished)
[condition wait];

[condition unlock];
return result.records;
}

然后在工具包调用的方法中提供您要做的结果:
- (void) queryResult:error:context: {
// Deal with results
[condition lock]
finished = YES;
[condition signal];
[condition unlock];
}

您可能希望在类声明中封装“条件”和“完成”变量。

希望这可以帮助。

更新:这是一些将工作卸载到后台线程的代码:
NSOperationQueue* queue = [NSOperationQueue new];
[queue addOperationWithBlock:^{
// Invoke getAllAccounts method
}];

当然,您可以保留队列以供以后使用,并将工作的实际队列移动到您的方法调用内部,以使事情更整洁。

关于iphone - 如何等待异步方法结束?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6333133/

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