В моем приложении у меня есть экран входа в систему, представленный в виде модального контроллера. После успешного входа в систему модальное представление отклоняется, и данные приложения обновляются из веб-службы. Затем пользователь может работать с новыми загруженными данными.-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
, которое лишит что-либо в цикле запуска, созданного этим контроллером?
Я сделал простое приложение с описаниями, которые вы описываете (два долгоживущих контроллера представлений, где модально представленная проблема выдает performSelector: withObject: afterDelay :) и кажется, что она работает нормально. Может быть, есть что-то еще, что удерживает -doBackgroundSync от регистрации нового вызова самому себе? –