2010-08-25 2 views
1

Я хочу реализовать класс X, который делает некоторые асинхронные вызовы, но в глазах вызывающего ClassC класс X должен казаться последовательным.Как реализовать управляемый событиями алгоритм в Objective-C, аналогичный NSXMLParser

ClassC будет создавать экземпляр класса ClassX, который вызывает некоторые HTTP-вызовы через NSURLConnection, и, таким образом, он становится асинхронным (и я хочу, чтобы он оставался асинхронным).

Логика протекает так:

ClassC:

- (void)callerWork 
{ 
    // shouldn't return until connection response completes 
    // and receives all of the response data 
    BOOL result = [classX doSomeWork]; 
} 

ClassX:

- (void)doSomeWork 
{ 
    // With an NSURLRequest, initiates a NSURLConnection 

    // Only after all of the data is received (or error) from 
    // NSURLConnection via NSURLConnectionDelegate methods, 
    // return from this method 
} 

// Implements relevant NSURLConnectionDelegate methods 
- (void)connectionDidFinishLoading:(NSURLConnection *)connection 
{ } 
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response 
{ } 
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data 
{ } 
- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error 
{ } 
@end 

В принципе, я хочу, чтобы имитировать, как NSXMLParser работает в том, что вы вызываете его метод "разобрать" который не возвращается, пока не будет выполнена вся работа. Для обработки данных, NSXMLParser будет вызывать соответствующие методы NSXMLParserDelegate, реализованные классом вызова, например, так:

- (void)parseWork 
    NSXMLParser *parser = [[NSXMLParser alloc] initWithData:dataToParse]; 
    [parser setDelegate:self]; 

    // 'parse' method doesn't return right away - execution continues 
    // only after all of the data has been parsed, which means the delegate 
    // methods are getting called in the interim. 
    BOOL parseResult = [parser parse]; 
} 

Что такое хороший способ сделать это?

Я знаю, что вам нужно, чтобы один класс служил делегатом другого для обратных вызовов , но с каким механизмом вы делаете «синтаксический разбор» не возвращением сразу?

ответ

0

Метод classX может запустить другой поток, чтобы выполнить всю работу async и спать до тех пор, пока рабочий поток не разбудит его при завершении. Не вызывайте этот метод из основного потока, хотя вы не хотите спать в основном потоке пользовательского интерфейса.

+0

Как насчет использования NSRunLoop? –

+0

Новый цикл цикла все равно должен быть в другом потоке, чем вызов метода классаX. – hotpaw2

Смежные вопросы