在 iOS 8 Today Extension 中获取 parse.com 用户数据时出现异常

Posted

技术标签:

【中文标题】在 iOS 8 Today Extension 中获取 parse.com 用户数据时出现异常【英文标题】:Exception when fetching parse.com user data in iOS 8 Today Extension 【发布时间】:2015-06-15 13:41:34 【问题描述】:

我正在尝试获取 PFUser 的 PFObjects 列表以显示在 ios 8 Today Widget 中。

在 Parse 的 blog post 之后,我在我的主应用程序和 Xcode 扩展程序中启用了相同的应用程序组和钥匙串共享。

我还在主应用程序的 AppDelegate 和 Today Extension 的 viewDidLoad 中启用了以下功能:

[Parse enableLocalDatastore];
[Parse enableDataSharingWithApplicationGroupIdentifier:@"group.com.me.myapp" containingApplication:@"com.me.myapp"];
[Parse setApplicationId:@"myAppId" clientKey:@"myClientId"];

widgetPerformUpdateWithCompletionHandler 中,我构造并执行了我的查询:

- (void) widgetPerformUpdateWithCompletionHandler:(void (^)(NCUpdateResult))completionHandler 
      PFQuery *query = [PFQuery queryWithClassName:@"Note"];
      [query whereKey:@"User" equalTo:[PFUser currentUser]];

      [query findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) 
         if (!error)
         
            // check for difference between current and new data
            if([self hasNewData:objects]) 
                // fresh data
                notes = objects;
                [self.tableView reloadData];
                [self updatePreferredContentSize];
                completionHandler(NCUpdateResultNewData);
             else 
                // Data is the same
                completionHandler(NCUpdateResultNoData);
            
          else 
            // Failed
            completionHandler(NCUpdateResultFailed);
         
      ];
    

第一次加载似乎工作正常 - 我能够获得我的 PFObjects 列表。但是,每当第二次重新加载扩展程序时,都会在 viewDidLoad 中的 enableDataSharingWithApplicationGroupIdentifier 调用中引发以下异常:enableDataSharingWithApplicationGroupIdentifier:containingApplication:' must be called before 'setApplicationId:clientKey''

我可以通过将通知中心滑动到“通知”选项卡并将其向后滑动来复制此重新加载,这将导致再次调用 viewDidLoad。

我已经仔细检查了调用方法的顺序是否正确,甚至修改了顺序但仍然出现崩溃。

有什么想法吗?提前致谢!

【问题讨论】:

【参考方案1】:

试试这个

if(![Parse isLocalDatastoreEnabled]) 
    [Parse enableLocalDatastore];
    [Parse enableDataSharingWithApplicationGroupIdentifier:@"group.com.me.myapp" containingApplication:@"com.me.myapp"];
    [Parse setApplicationId:@"myAppId" clientKey:@"myClientId"];

【讨论】:

确保 Parse 在扩展中只初始化一次可以缓解崩溃。但是,当我登录或退出主应用程序时,[PFUser currentUser] 的状态现在保持不变。 能否提供您的代码,您在哪里使用 PFUser? 我在上面的初始化步骤之后,在我的扩展的 viewDidLoad 中访问 [PFUser currentUser]。 您是否在扩展中从 LocalDatastore 获取 PFUser?您是否在主应用程序的注销\登录时更改了固定的 PFUser? 不,我没有从本地数据存储中检索 PFUser。根据parse.com/docs/ios/guide#extensions-shared-local-data 的文档,当前的 PFUser 应该在应用程序之间保持不变,因此我希望同步是无缝的,无需任何形式的手动固定或检索。在登录和退出我的应用程序时,我也没有更改固定的 PFUser。

以上是关于在 iOS 8 Today Extension 中获取 parse.com 用户数据时出现异常的主要内容,如果未能解决你的问题,请参考以下文章

在 iOS 8 Today Extension 中获取 parse.com 用户数据时出现异常

如何通过 Today Extension (iOS 8) 访问 Core Data/CloudKit

在 iOS 8 Today Extension 中从 Storyboard 加载特定的 ViewController

iOS 8 Today Extension:是不是可以添加可编辑的文本字段?

iOS扩展Extension之Today

在 iOS Today Extension 中绘制而不滚动整个 NC