2010-10-15 6 views
0

В моем приложении у меня есть экран входа в систему, представленный в виде модального контроллера. После успешного входа в систему модальное представление отклоняется, и данные приложения обновляются из веб-службы. Затем пользователь может работать с новыми загруженными данными.-performSelector: afterDelay: и контроллеры модального просмотра

Периодически мы проверяем, необходимо ли синхронизировать данные на сервере. Мы делаем это, используя набор функций в нашем AppDelegate, который периодически опрашивает любые изменения. У нас есть один метод, который запускает опрос:

- (void) startBackgroundSync { 
    if (self.queue == nil) { 
     self.queue = [[NSOperationQueue alloc] init]; 
    } 
    [self performSelector:@selector(doBackgroundSync) withObject:nil afterDelay:5.f]; 
} 

А потом -doBackgroundSync фактически проверяет изменения и добавляет операцию синхронизации к NSOperationQueue. Затем он возвращается в исходное положение следующим образом:

-(void) doBackgroundSync { 
    NSLog(@"Check for changes"); 
    // check for changes and add operation to queue 
    [self performSelector:@selector(doBackgroundSync) withObject:nil afterDelay:5.f]; 
} 

Первоначально мы назвали -startBackgroundSync из модального контроллера представления Логин (прежде чем он был уволен). Затем мы изменяем некоторые другие настройки и отклоняем контроллер модального представления. Контроллер просмотра входа в систему не освобождается при увольнении, но сохраняется приложением AppDelegate (более поздние времена, когда мы должны «перезагрузить» приложение). После того, как контроллер модального представления был отклонен, -doBackgroundSync никогда не вызывался. Если мы поместим вызов для -startBackgroundSync в главный контроллер вида, который отображается после отклонения диспетчера модального просмотра, то -doBackgroundSync непрерывно вызывается, как ожидалось.

Что может вызывать такое поведение? Есть ли что-то в -dismissModalViewController, которое лишит что-либо в цикле запуска, созданного этим контроллером?

+0

Я сделал простое приложение с описаниями, которые вы описываете (два долгоживущих контроллера представлений, где модально представленная проблема выдает performSelector: withObject: afterDelay :) и кажется, что она работает нормально. Может быть, есть что-то еще, что удерживает -doBackgroundSync от регистрации нового вызова самому себе? –

ответ

0

перейдите сюда для получения более подробной информации View Controller Programming Guide for iOS, но «отклонение» модального контроллера возвращает приложения в прежнее состояние. Предлагаемый способ поддержания цикла запуска состоит в том, чтобы запросить у него делегат от модального контроллера.

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