iOS: обновление данных, когда приложение выводится на передний план
Я получаю данные с сервера через JSON и отображаю их на ярлыках. Я добавил этот метод в viewDidLoad.
Я хочу обновить данные, когда пользователь снова откроет приложение. В настоящее время, даже если я убью приложение в симуляторе и запусту приложение снова, оно не обновится.
Я попробовал метод viewDidAppear, но по какой-то причине он не выполняется.
-(void)viewDidAppear{
NSLog(@"Called viewDidAppear");
}
Это никогда не называется. Я пытался свернуть приложение, но оно не сработало.
4 ответа
Я следовал этому руководству - http://leejon.es/notifying-a-viewcontroller-with-uiapplicationdidbecomeactivenotification/
Сначала прикрепите к уведомлению в методе viewWillAppear целевого контроллера представления:
- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
[[NSNotificationCenter defaultCenter] addObserver: self
selector: @selector( appActivated: )
name: UIApplicationDidBecomeActiveNotification
object: nil];
}
- (void)viewWillDisappear:(BOOL)animated
{
[super viewWillDisappear:animated];
[[NSNotificationCenter defaultCenter] removeObserver:self ];
}
- (void)appActivated:(NSNotification *)note
{
[self update];
}
Вы можете прослушивать уведомления и отвечать соответствующим образом. Попробуйте использовать их и решить, что работает для вашего предполагаемого рабочего процесса.
UIApplicationDidBecomeActiveNotification
UIApplicationWillEnterForegroundNotification
Вы можете использовать ответить на уведомление, как это.
[[NSNotificationCenter defaultCenter] addObserverForName: UIApplicationDidBecomeActiveNotification object: nil queue: [NSOperationQueue mainQueue] usingBlock:^(NSNotification *note) {
// LOAD JSON
}];
ViewDidAppear: метод принимает параметр bool, когда представление отображалось с отсутствующей анимацией. Также вам нужно вызвать реализацию суперкласса:
- (void)viewDidAppear:(BOOL)animated
{
[super viewDidAppear: animated];
NSLog(@"Called viewDidAppear");
}
В вашей реализации делегата приложения есть метод, который называется:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions;
Этот метод вызывается при каждом запуске приложения, поэтому я думаю, что он соответствует вашим потребностям. Если вы разместите здесь свой код, он должен работать.
Кроме того, имейте в виду, что вы не должны выполнять синхронный вызов здесь, потому что вы задержите запуск приложения.
РЕДАКТИРОВАТЬ: этот метод будет вызываться только при запуске приложения. Вы можете разместить свой код внутри метода и вызвать его из приложения didFinishLaunchingWithOptions, а затем также вызвать его из метода:
- (void)applicationWillEnterForeground:(UIApplication *)application;
Этот метод будет вызываться, когда приложение выходит на передний план, но не после первого запуска, поэтому будьте осторожны.
Я также думаю, что вы должны проверить методы UIApplicationDelegate со страницы разработчика Apple: http://developer.apple.com/library/ios/#documentation/uikit/reference/UIApplicationDelegate_Protocol/Reference/Reference.html Кроме того, проверьте изменения состояния приложения: http://developer.apple.com/library/ios/#documentation/iphone/conceptual/iphoneosprogrammingguide/ManagingYourApplicationsFlow/ManagingYourApplicationsFlow.html