【问题标题】:Issue using FBRequestConnection error handler for fetching Facebook data使用 FBRequestConnection 错误处理程序获取 Facebook 数据的问题
【发布时间】:2013-04-08 10:03:03
【问题描述】:

为了一次获取所有朋友的详细信息,我使用 FQL 查询和带有错误处理程序的 FBRequestConnection 将所有数据保存到数组中,即

- (void)fetchFriendDetails
{
    NSString* query = [NSString stringWithFormat:@"SELECT uid,name,birthday_date,pic_square FROM user WHERE uid IN (SELECT uid2 FROM friend WHERE uid1 = me())"];

    // Set up the query parameter
    NSDictionary *queryParam = [NSDictionary dictionaryWithObjectsAndKeys:
                                query, @"q", nil];
    // Make the API request that uses FQL
    [FBRequestConnection startWithGraphPath:@"/fql"
                                 parameters:queryParam
                                 HTTPMethod:@"GET"
                          completionHandler:^(FBRequestConnection *connection,
                                              id result,
                                              NSError *error) {
                              if (!error)
                              {
                                  NSArray *tempArray = [result valueForKey:@"data"]; 
                                  NSMutableArray *tempArrayAbout = [NSMutableArray arrayWithArray:tempArray]; 
                                  self.friendsDetailsArray = tempArrayAbout;
                                  NSLog(@"details are %@",friendsDetailsArray);
                              }
                          }];
}

当用户单击同步按钮时,执行上述方法,然后执行将数据保存到数据库。但是我这里有个问题!由于 FBRequestConnection 错误处理程序是一个回调函数,发生的情况是它最初不执行,并且对于第二次尝试,它进入并将所有朋友数据保存在 friendsDetailsArray 中,这是我的同步按钮操作:

- (IBAction)syncSettings:(id)sender
{
if (self.remindBeforeDaysField.text.length != 0 && self.setTimeField.text.length != 0)
    {
        self.syncProgressHUD = [[MBProgressHUD alloc] initWithView:self.navigationController.view];
        self.syncProgressHUD.labelText = kSyncingBirthdays;
        self.syncProgressHUD.detailsLabelText = kPleaseWait;
        self.syncProgressHUD.mode = MBProgressHUDModeIndeterminate;
        [self.navigationController.view addSubview:syncProgressHUD];
        syncProgressHUD.delegate = self;
        dispatch_async(dispatch_get_global_queue( DISPATCH_QUEUE_PRIORITY_LOW, 0), ^{
            // Do the task in the background
            [syncProgressHUD show:YES];
            [self saveUpdateFriendDetails];
            // Hide the HUD in the main thread 
            dispatch_async(dispatch_get_main_queue(), ^{
                [MBProgressHUD hideHUDForView:self.view animated:YES];
            });
        });
    }
}

由于我的 friendsDetailsArray 有问题,我不得不将我的代码移动到 viewDidLoad 方法,就保存数据而言,这对我来说效果很好。我不明白我为什么会这样尽管我可以看到所有条件、数组值、通过日志记录保存所有 Facebook 朋友 ID 的集合,但无法更新数据。换句话说,我可以保存朋友的详细信息,但无法更新。

令我惊讶的是,我在调试时发现了一些疯狂的事情,我已经检索了所有 Facebook 朋友 id(如果存在)并存储在 NSMutableSet 中,然后检查该集合是否包含我们的 Facebook 朋友 id 的条件,我想想如果我的数据库已经保存了好友记录,那么条件应该是有效的,但令人震惊的是它没有验证并跳转到反之亦然的条件,即如果 set 不包含我们的 Facebook id,这是我的示例实现代码:

-(void)saveUpdateFriendDetails
{
NSLog(@"reminder set values are %@",remindersSet);
NSLog(@"id is %@",facebookID);
if(updateIfExistSwitch.on && [remindersSet containsObject:facebookID])
{
   //Do update stuff
}

else if(![remindersSet containsObject:facebookID])
{
   //Do insertion stuff
}
}

这是记录的输出以供澄清:

我们可以在图像中观察到我的 Facebook id 存在于 NSMutableSet 中,即提醒集,我不知道为什么会出现这种情况:if(updateIfExistSwitch.on && [remindersSet containsObject:facebookID]) 没有被验证:O

另外,我相信在 viewDidLoad 中编写代码根本不是解决该场景的正确方法,谁知道呢,用户可能会输入详细信息并快速单击同步按钮,而此时好友详细信息的同步将不会发生。我也测试了这个场景。我认为所有的东西都围绕一个地方旋转,即FBRquestConnection 错误处理程序,我可以通过调试看到它不是第一次进入循环,而是第二次。

我希望先执行获取朋友详细信息操作,然后再将数据保存/更新到 sqlite 数据库。

注意:saveUpdateFriendDetails是我保存或更新数据的方法,你可以观察同步按钮动作中的[self saveUpdateFriendDetails]这一行

谁能指导我一下?

有用的建议鼓掌,在此先感谢:)

【问题讨论】:

    标签: iphone facebook error-handling facebook-fql


    【解决方案1】:

    我终于找到了解决方案,让我回答我自己的问题,以便有人可以从中受益。成功解决了 2 个问题:

    -> [remindersSet containsObject:facebookID] 条件失败,因为 facebookID 是以 NSDecimal 格式检索的,所以我们需要在检索之前指定字符串格式。

    ->第二个问题是回调函数,因为它是回调函数,所以我们需要在获取详细信息并保存到数组后执行保存或更新操作。

    希望对大家有所帮助

    谢谢:)

    【讨论】:

      猜你喜欢
      • 2013-08-26
      • 2015-06-02
      • 1970-01-01
      • 2021-11-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-18
      • 1970-01-01
      相关资源
      最近更新 更多