为了一次获取所有朋友的详细信息,我使用了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);
}
}];
}
当用户单击同步按钮时,执行上述方法,稍后将数据保存到db中。但我在这里有一个问题!由于FBRequestConnection错误处理程序是一个回调函数,它最初不会执行,第二次尝试它进入并保存 friendsDetailsArray 中的所有朋友数据,这是我的同步按钮操作:< / p>
- (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,我是想想如果我的数据库已经拥有好友记录,那么条件应该是有效的,但令人震惊的是它没有验证并跳到反之亦然条件,即如果设置不包含我们的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即remindersSet中,我不知道为什么条件: if(updateIfExistSwitch.on&amp;&amp; [remindersSet containsObject:facebookID]) 未经过验证:O
另外,我认为在viewDidLoad中编写代码并不是解决方案的正确方法,因为谁知道,用户可能会快速输入详细信息并单击同步按钮,并且当朋友细节同步时不会发生.I我也测试了这个场景。我认为所有的东西都围绕着一个地方,即FBRquestConnection错误处理程序,因为我可以通过调试看到它第一次没有进入循环,但是第二次。
我希望首先执行获取朋友详细信息操作,然后再将数据保存/更新到sqlite数据库中。
注意:saveUpdateFriendDetails是我保存或更新数据的方法,您可以在同步按钮操作中观察[self saveUpdateFriendDetails]行
任何人都可以指导我吗?
有用的建议鼓掌,提前谢谢:)
答案 0 :(得分:0)
我终于找到了解决方案,让我回答我自己的问题,以便有人可以从中受益。解决2个问题:
<强> - &GT; [remindersSet containsObject:facebookID]条件失败,因为以NSDecimal格式检索facebookID,因此我们需要在检索之前指定字符串格式。
<强> - &GT;第二个问题是回调函数,因为它是一个回调函数,我们需要在获取细节并保存到数组后执行保存或更新操作。
希望这有助于某人
谢谢:)