一个问题和一个问题: 我有以下代码:
- (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对象正在被垃圾收集。那可能吗?关于什么可能导致崩溃的任何其他想法?或者如何查看任何错误消息?
答案 0 :(得分:3)
1)为了让应用程序在后台运行,您应该使用" 后台执行和多任务部分here中提到的模式之一:
如果您没有使用上述任何一项,则无法在后台获取异步事件。
2)为了看到崩溃日志/调用堆栈放置异常断点或查看"设备日志"此处的部分:窗口 - >管理器 - >设备 - >"设备名称"在左边 - > Xcode上的设备日志。
答案 1 :(得分:1)
我在后台运行代码所做的是做
之类的事情在.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的级别。这似乎有效。如果在应用程序处于后台/暂停时发出通知,我仍然无法弄清楚如何引发通知(即执行回叫)。这样可以防止包含回调的对象被清除。