今天,当widgetPerformUpdateWithCompletionHandler包含异步主体时,iOS 8的扩展问题

use*_*526 6 objective-c ios ios8 ios-app-extension

我正在使用iOS 8上提供的新的Today Extension.在设备上调试似乎非常困难,结果不一致所以我一直在使用模拟器.

我正在构建的扩展是一个非常简单的扩展,只是每天显示一个不同的图像,流程实际上非常简单:

  • iOS调用widgetPerformUpdateWithCompletionHandler
  • 我异步下载图像
  • 如果图像已成功下载,我在故事板上设置了相应的插座,并使用常量调用完成块:NCUpdateResultNewData
  • 如果发生错误,我使用常量调用完成块:NCUpdateResultFailed

根据Apple的参考文档,每次我们使用常量NCUpdateResultNewData调用完成块时,窗口小部件的快照应该更新到当前视图,但是,这不会一直有效,有时iOS似乎使用较旧的快照.

代码很简单,这里是widgetPerformUpdateWithCompletionHandler代码:

-(void)widgetPerformUpdateWithCompletionHandler:(void (^)(NCUpdateResult))completionHandler {
__weak TodayViewController *weakSelf = self;
NSURL *URL = [NSURL URLWithString:@"http://www.muratekim.com/wp-content/uploads/apple-logo-small.png"];
NSURLRequest *request = [NSURLRequest requestWithURL:URL];
NSURLSession *session = [NSURLSession sharedSession];
NSURLSessionDataTask *task = [session dataTaskWithRequest:request completionHandler:
                              ^(NSData *data, NSURLResponse *response, NSError *error) {
                                  if (!error) {
                                      UIImage *image = [UIImage imageWithData:data];
                                      weakSelf.imageView.image = image;
                                      weakSelf.img = image;
                                      completionHandler(NCUpdateResultNewData);
                                  }
                                  else {
                                      completionHandler(NCUpdateResultFailed);
                                  }
                              }];
[task resume];
}
Run Code Online (Sandbox Code Playgroud)

提前致谢!泽