如何等待异步方法结束?

| 我有一个需要使用的工具箱(与远程服务接口)。该工具包查询远程服务并询问结果。它异步执行此操作,这在大多数情况下是好的,但不适用于创建简洁的方法。我想使方法类似于以下内容:
-(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上的OS杀死。 为了在后台线程中完成工作,我强烈建议您使用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];
}
您可能希望在类声明中封装\“ condition \”和\“ finished \”变量。 希望这可以帮助。 更新:这是一些将工作卸载到后台线程的代码:
NSOperationQueue* queue = [NSOperationQueue new];
[queue addOperationWithBlock:^{
    //  Invoke getAllAccounts method
}];
当然,您可以保留队列以备后用,并将工作的实际排队移到方法调用中以使事情变得更整洁。     
        等待的方法是从当前代码返回。在您指定的异步回调方法中,完成等待后要完成的操作。这有什么难的? 主UI线程中的任何同步等待都会阻塞UI,并使用户认为您的应用已锁定,这可能比您认为代码不够简洁的情况要糟得多。     

要回复问题请先登录注册