У меня есть следующий код в AppDelegate. Цель состоит в том, чтобы создать пару наблюдателей, а затем вызвать некоторый код. Как только этот код завершит его, он отправляет уведомление, и наблюдатель должен удалить обоих наблюдателей и вызвать обработчик завершения.
Моя проблема в том, что кажется, что наблюдатели не удаляются, как я ожидал. Уведомление публикуется, а запись NSLog записывается в консоль, поэтому я знаю, что наблюдатель работает. Однако при втором вызове NSLog вызывается дважды, в третий раз — три раза и т. д.
Я думаю, что это связано с удалением в блоке кода, который выполняется из наблюдателя, однако я не уверен, как я могу это решить (если это действительно проблема).
Может ли кто-нибудь быть так любезен, чтобы объяснить, как я могу этого добиться?
Спасибо.
-(void) application:(UIApplication *)application performFetchWithCompletionHandler:
(void (^)(UIBackgroundFetchResult))completionHandler {
[[NSNotificationCenter defaultCenter] addObserverForName:@"fetchDidCompleteNewData" object:nil
queue:nil usingBlock:^(NSNotification *completed) {
//Remove Observers
[[NSNotificationCenter defaultCenter] removeObserver:self
name:@"fetchDidCompleteNewData"
object:nil];
[[NSNotificationCenter defaultCenter] removeObserver:self
name:@"fetchDidCompleteNoData"
object:nil];
// Post completion
completionHandler(UIBackgroundFetchResultNewData);
NSLog(@"Background fetch completed... New Data");
}];
[[NSNotificationCenter defaultCenter] addObserverForName:@"fetchDidCompleteNoData" object:nil
queue:nil usingBlock:^(NSNotification *completed) {
//Remove Observers
[[NSNotificationCenter defaultCenter] removeObserver:self
name:@"fetchDidCompleteNoData"
object:nil];
[[NSNotificationCenter defaultCenter] removeObserver:self
name:@"fetchDidCompleteNewData"
object:nil];
//post completion
completionHandler(UIBackgroundFetchResultNoData);
NSLog(@"Background fetch completed... No New Data");
}];
GetDetails *getDetails = [[GetDetails alloc] init];
[getDetails backgroundRefresh];
}
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
[[UIApplication sharedApplication] setMinimumBackgroundFetchInterval:UIApplicationBackgroundFetchIntervalMinimum];
return YES;
}