我有一个工具包,我需要使用(与远程服务接口)。该工具包查询远程服务并询问结果。它是异步执行的,在大多数情况下它是好的,但不是用于创建简洁的方法。我要让方法类似于以下:如何等待异步方法结束?
-(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;
}
的问题是,该工具包内的方法相互调用使用@选择,而不是直接调用,因此让返回值是困难的。此外,实际查询使用:
NSURLConnection *connection = [[[NSURLConnection alloc] initWithRequest:aRequest delegate:self] autorelease];
这是异步的。当从服务接收到数据时,我的方法早已返回......没有这些信息。所以我的问题是这样的:有没有办法暂停执行,直到数据被返回?我可以使用第二个线程来获得主线程休息时的数据(或使用3个线程,因此主线程不会休息?)
我不想编辑工具包以更改其方法或添加一个新的)是同步的,那么是否有办法按照我的意愿创建一个方法?
看起来,构建你的代码,我的执行到while循环,并“永远等待”,而不是响应queryResult方法。想法?感谢您的回应! – 2011-06-13 16:50:11
嗯,queryResult方法实际上是否被调用?你可以在那里放置断点以确保条件得到信号?我应该指出,如果您的queryResult方法由于某种原因未被调用,您的getAllAccounts方法将永远阻塞。 – OzBandit 2011-06-13 17:20:32
另外,尝试在while循环中添加一些跟踪输出以查看条件是否被解除阻塞。也许它不会因为某些原因而对变量进行修改。 – OzBandit 2011-06-13 17:22:42