Возможно, вы захотите НЕ делать все синхронно, особенно если пример кода в вашем посте запущен в основной ветке приложения.Если вы сделаете это, основной поток заблокирует пользовательский интерфейс, и приложение перестанет отвечать, пока удаленная транзакция не будет завершена.
Поэтому, если вы действительно настаиваете на синхронном подходе, то вам определенно следует сделать это вфоновый поток, чтобы пользовательский интерфейс не переставал отвечать на запросы, что может привести к тому, что ваше приложение будет убито операционной системой на iphone.
Для работы в фоновом потоке я настоятельно рекомендую использовать Grand CentralОтправка материала, а именно 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» и «done» в объявлении класса.
Надеюсь, это поможет.
ОБНОВЛЕНИЕ: Вот некоторый код для разгрузки работы в фоновый поток:
NSOperationQueue* queue = [NSOperationQueue new];
[queue addOperationWithBlock:^{
// Invoke getAllAccounts method
}];
Конечно, вы можете сохранить очередь для дальнейшего использования и переместить фактическую очередь работы в вызов вашего метода, чтобы сделать вещи более аккуратными.