Я создаю приложение для iPhone, которое сильно использует веб-сервис, который я написал на php. Прямо сейчас у меня есть файл (API.h/API.m), который имеет методы, которые вызывают функции php на моем веб-сервисе через NSURLConnection.Существуют ли более чистые методы обработки асинхронных HTTP-запросов, чем делегирование в Objective-C?
методы, такие как:
-(void) mediaAdd:(UIImage *)image withDelegate: (id<apiRequest>) delegate;
-(void) mediaGet:(NSString *)imageURL withDelegate: (id<apiRequest>) delegate;
Эти методы называются контроллерами в приложении (контроллеры, определенные в шаблоне MVC), а также методы принимают в контроллере в качестве делегата.
Как только запрос вызванного метода в API.h/API.m завершен, метод делегата NSURLConnection в API.h/API.m, который вызывается, когда запрос завершен, затем вызывает метод делегирования. .
-(void) serverResponse:(NSDictionary *) response fromCall:(NSString *)call;
... который, конечно, выполняется на контроллере, который вызывает метод в API.h/API.m.
Моя проблема, или, скорее, дезорганизация возникает, когда диспетчеру необходимо выполнить более одного вызова API. Поскольку у меня есть единственный метод делегата, я различаю между различными вызовами, используя параметр вызова в методе serverResponse.
Вот скелет экземпляра метода serverResponse:
//API Delegate
-(void)serverResponse:(NSDictionary *)response fromCall:(NSString *)call {
bool local = false;
NSString *callbackString;
if (local) {
callbackString = @"http://localhost/";
} else {
callbackString = @"http://secret.com/";
}
if ([call isEqualToString:[NSString stringWithFormat:@"%@user/add",callbackString]]) {
//user/add was called
if (![[response objectForKey:@"status"] isEqualToString:@"fail"]) {
if ([[response objectForKey:@"status"] isEqualToString:@"fail"]) {
if ([[response objectForKey:@"reason"] isEqualToString:@"udid already taken"]) {
//UDID taken
}
} else {
//UDID not taken, we're good to go
}
} else {
NSLog(@"fail");
}
} else if([call isEqualToString:[NSString stringWithFormat:@"%@moment/get",callbackString]]){
//moment/get was the api call
} else if([call isEqualToString:[NSString stringWithFormat:@"%@printPictures/printPic",callbackString]]){
//printPictures/printPic was the api call
} else {
NSLog(@"wrong call");
}
}
Мой вопрос, я должен идти вперед и сделать решительный шаг сделать метод делегата для каждого вызова API? Или я переусердствую об этом, и на самом деле есть действительно простой способ справиться с этим. Возможно, шаблон дизайна или структура?
Спасибо! - Mike
Отслеживание темы, но теперь, глядя на скелет, у меня много избыточного кода .. ха-ха. Просто заметив, что я замечаю это, я знаю, что это проблема. –
Вы можете передать блок завершения вместо делегата. –
Вы понимаете, что вы можете создать более одного делегата * объекта * для данного протокола делегата? Чтобы решить вашу проблему, просто создайте объект для каждого вызова API. –