NSNotificationCenter在后台应用程序时回调

时间:2014-06-23 11:33:31

标签: ios objective-c nsnotificationcenter ekeventkit

一个问题和一个问题: 我有以下代码:

- (void) registerForLocalCalendarChanges
{
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(localCalendarStoreChanged) name:EKEventStoreChangedNotification object:store ];

}

- (void) localCalendarStoreChanged
{
    // This gets call when an event in store changes
    // you have to go through the calendar to look for changes
    [self getCalendarEvents];
}

这些方法位于名为CalendarEventReporter的类/对象中,其中包含方法getCalendarEvents(在回调中)。

两件事: 1)如果应用程序在后台,则回调不会运行。有没有办法让它做到这一点? 2)当我将应用程序带回前台时(在更改设备上的日历之后),应用程序在调试窗口或设备上没有任何错误消息而崩溃。我的猜测是包含回调的CalendarEventReporter对象正在被垃圾收集。那可能吗?关于什么可能导致崩溃的任何其他想法?或者如何查看任何错误消息?

3 个答案:

答案 0 :(得分:3)

1)为了让应用程序在后台运行,您应该使用" 后台执行和多任务部分here中提到的模式之一:

  • 使用位置服务
  • 录制或播放音频
  • 提供VOIP 服务
  • 后台刷新
  • 与外部设备的连接 比如通过BLE

如果您没有使用上述任何一项,则无法在后台获取异步事件。

2)为了看到崩溃日志/调用堆栈放置异常断点或查看"设备日志"此处的部分:窗口 - >管理器 - >设备 - >"设备名称"在左边 - > Xcode上的设备日志。

答案 1 :(得分:1)

要回答您的第一个问题,请查看https://developer.apple.com/library/ios/documentation/iphone/conceptual/iphoneosprogrammingguide/ManagingYourApplicationsFlow/ManagingYourApplicationsFlow.html

我在后台运行代码所做的是做

之类的事情

在.h文件中

UIBackgroundTaskIdentifier backgroundUploadTask;

在.m文件中

-(void) functionYouWantToRunInTheBackground
{    
    self.backgroundUploadTask = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{
        [self endBackgroundUpdateTask];
}];
//code to do something
}

-(void) endBackgroundUpdateTask
{
    [[UIApplication sharedApplication] endBackgroundTask: self.backgroundUploadTask];
    self.backgroundUploadTask = UIBackgroundTaskInvalid;
}

上面的代码我从objective c - Proper use of beginBackgroundTaskWithExpirationHandler

中学到了很多东西

至于你的第二个问题,你应该设置一个断点,当你把应用程序带回前台时,应该运行代码。如果没有足够的代码或信息,没有人能够弄清楚应用程序崩溃的原因。

答案 2 :(得分:1)

问题第二部分的解决方案是提高包含回调代码的对象的范围。我将它提升到包含ViewController的级别。这似乎有效。如果在应用程序处于后台/暂停时发出通知,我仍然无法弄清楚如何引发通知(即执行回叫)。这样可以防止包含回调的对象被清除。