我为德国冰球联盟DEL制作了今天的小部件。
我从我们的服务器加载下一个游戏并在tableView中显示它们。加载过程在建议的方法" widgetPerformUpdateWithCompletionHandler"中开始。最初我在" viewWillAppear"中加载一些缓存数据。
到目前为止一切都很好!
但过了一会儿(一天),小工具停止工作。当我打开通知中心时,窗口小部件显示正常,但它永远不会再次更新。我必须从通知中心删除小部件,并且必须再次添加它。之后,小部件可以工作一天,然后再次停止工作。
要查看小部件正在做什么,我在桌面视图上方添加了一个简单的白色视图,同时在" widgetPerformUpdateWithCompletionHandler"中加载数据。查看窗口小部件是否正在执行任何操作。小部件工作时会显示白色视图。当它不工作时,状态视图不会出现。所以我认为方法" widgetPerformUpdateWithCompletionHandler"在窗口小部件在通知中心活动一段时间后,不会调用它。
我不知道导致小部件停止工作的原因。有什么想法吗?
答案 0 :(得分:19)
我遇到了同样的问题,我通过致电completionHandler(NCUpdateResultNoData);
解决了这个问题
在您的网络请求后,即使没有返回响应。我发现如果没有调用完成处理程序widgetPerformUpdateWithCompletionHandler
将不再被调用,因此不再有任何更新。还要确保在请求调用返回后在所有分支中调用完成处理程序。
答案 1 :(得分:13)
正如其他人所提到的,这是因为在调用completionHandler
之后没有事先调用widgetPerformUpdateWithCompletionHandler
。 您需要确保completionHandler
被调用,无论是什么。
我建议处理这个问题的方法是将completionHandler保存为实例变量,然后在viewDidDisappear中调用它失败:
@property(nonatomic, copy) void (^completionHandler)(NCUpdateResult);
@property(nonatomic) BOOL hasSignaled;
- (void)widgetPerformUpdateWithCompletionHandler:(void (^)(NCUpdateResult))completionHandler {
self.completionHandler = completionHandler;
// Do work.
}
- (void)viewDidDisappear:(BOOL)animated {
[super viewDidDisappear:animated];
if (!self.hasSignaled) [self signalComplete:NCUpdateResultFailed];
}
- (void)signalComplete:(NCUpdateResult)updateResult {
NSLog(@"Signaling complete: %lu", updateResult);
self.hasSignaled = YES;
if (self.completionHandler) self.completionHandler(updateResult);
}
答案 2 :(得分:3)
另一个问题是,一旦widgetPerformUpdateWithCompletionHandler:
被停止被调用,就永远不会有另一个完成处理程序来调用。我还没有办法让系统再次调用widgetPerformUpdateWithCompletionHandler:
。因此,请确保您的小部件还会尝试通过viewWillAppear:
重新加载数据作为后备,或者某些用户可能会遇到非加载小部件。
答案 3 :(得分:1)
在异步调用返回之前,在widgetPerformUpdateWithCompletionHandler中使用NCUpdateResultNewData调用completionHandler并使用NCUpdateResultNewData或NCUpdateResultFailed再次调用它似乎有效。