Выполнение нескольких вызовов службы при инициализации приложения iPhone - PullRequest
0 голосов
/ 03 сентября 2010

Мне нужно сделать несколько асинхронных вызовов службы в приложении: didFinishLaunchingWithOptions: метод из моего делегата приложения, чтобы извлечь некоторые данные из службы, которые будут использоваться различными контроллерами в моем приложении.У меня есть контроль над службой, и я спроектировал API как можно более RESTful, поэтому мне нужно сделать несколько вызовов во время инициализации приложения.

Я хочу показать представление загрузки синдикатор хода выполнения - аналогично экрану заставки по умолчанию из Default.png - и удалите это представление после завершения вызовов службы и получения начальных значений, которые мне нужны.Это довольно легко сделать, если есть только один вызов службы, поскольку я могу просто подключить эту логику к методу connectionDidFinishLoading: делегат NSURLConnection, скрыв представление загрузки и отобразив корневой контроллер.

Однако с несколькими службамизвонки, становится сложно.Я могу «связать» все вместе и запустить один запрос, дождаться его завершения / сбоя, затем запустить второй запрос и так далее, пока не доберусь до последнего запроса.В последнем запросе я скрываю загрузочный вид и отображаю обычный вид.Тем не менее, это может быть громоздким с несколькими вызовами службы, и код становится трудно понять и следовать.

Любые предложения о лучшем подходе для этого?иметь одноэлементный класс, отвечающий за вызовы службы и инициализацию приложения.Объект singleton будет запускать все необходимые запросы параллельно при запуске, и каждый обратный вызов fail / finish будет проверять, завершен ли каждый запрос.Если все запросы завершены, он может вызвать некоторый метод в делегате приложения и сказать ему, чтобы скрыть представление загрузки, показать корневой контроллер и т. Д.

Мысли?

Ответы [ 3 ]

0 голосов
/ 03 сентября 2010

Я делаю что-то подобное с NSOperationQueue, который настроен на запуск только 1 операции за раз.Смотрите, например, WeaveEngine.m , и это synchronizewithServer:credentials: метод.Я ставлю в очередь все отдельные операции, которые в основном представляют собой асинхронные сетевые вызовы.

0 голосов
/ 03 сентября 2010

вы можете использовать NSThreading и выполнять синхронные вызовы в отдельных потоках для каждой вещи, которую вам нужно получить, например

[NSThread detachNewThreadSelector:@selector(getDataRequest1:) toTarget:self withObject:urlRequest];
[NSThread detachNewThreadSelector:@selector(getDataRequest2:) toTarget:self withObject:urlRequest];
[NSThread detachNewThreadSelector:@selector(getDataRequest3:) toTarget:self withObject:urlRequest];

, затем в селекторе для каждого потока сделайте что-то вроде

- (void) getDataRequest1:(NSURLRequest*)urlRequest {
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
    NSHTTPURLResponse *urlResponse;
    NSError *error;
    NSData *responseData = [NSURLConnection sendSynchronousRequest:urlRequest returningResponse:&urlResponse error:&error];
    NSString *responseString = [[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding];
    if ([urlResponse statusCode] < 200 || [urlResponse statusCode] > 299) {
        //request probably failed
    }else{
        [self performSelectorOnMainThread:@selector(completeRequest1:) withObject:responseData waitUntilDone:NO];           
    }
    [pool drain];
    [responseString release];
    [urlRequest release];   
}

конечно, это зависит от того, сколько запросов / потоков вы хотите создать.и вам нужно будет следить за тем, сколько вы порождаете против сколько финиша, чтобы вы могли правильно остановить вращение.

0 голосов
/ 03 сентября 2010

Другая возможность состоит в том, чтобы каждый обратный вызов завершения обслуживания уведомлял (NSNotification) контроллера о прогрессе, который был достигнут.Вы также можете сообщить контролеру индикатора выполнения о том, сколько запросов вы планировали сделать, и позволить ему вести счет, а сам сделать обратный вызов, когда решит, что все сделано.

...