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