Я хочу реализовать класс 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];
}
Что такое хороший способ сделать это?
Я знаю, что вам нужно, чтобы один класс служил делегатом другого для обратных вызовов , но с каким механизмом вы делаете «синтаксический разбор» не возвращением сразу?
Как насчет использования NSRunLoop? –
Новый цикл цикла все равно должен быть в другом потоке, чем вызов метода классаX. – hotpaw2