我是iOS开发的新手,我试图将我的应用与Facebook集成。 我已经通过了登录步骤,现在我正试图获取用户好友列表。
我需要将用户ID放在由';'分隔的列表中。所以我有以下代码:
-(NSMutableString *) getUserFacebookFriendsList
{
NSMutableString *userFBFriends = [[NSMutableString alloc] init];
[FBRequestConnection startWithGraphPath:@"/me/friends"
parameters:nil
HTTPMethod:@"GET"
completionHandler:^(FBRequestConnection *connection, id result, NSError *error) {
for (NSDictionary *friendData in [result objectForKey:@"data"])
{
NSMutableString *friendId = [friendData objectForKey:@"id"];
[userFBFriends appendString:friendId];
[userFBFriends appendString:@";"];
NSString *FBFriendsList = [NSString stringWithFormat:userFBFriends];
}
}];
return userFBFriends;
}
现在,当我调试呼叫时,我可以看到我确实得到了用户的朋友,但问题是当我到达返回状态时,它似乎是我的变量" userFBFriends"是空的....
知道我在这里缺少什么吗?
根据我得到的答案,我想发布我现在拥有的以下代码,也许有人可以帮我解决这个问题。
- (void)loginViewFetchedUserInfo:(FBLoginView *)loginView
user:(id<FBGraphUser>)user {
NSLog(@"test login facebook");
NSLog(@"the facbook user borthday is : %@",[user birthday]);
NSLog(@"The FACEBOOK user ID is : %@", [user objectID]);
NSLog( @"### running FB sdk version: %@", [FBSettings sdkVersion] );
// FBRequestConnection* conn = [[FBRequestConnection alloc] init];
NSLog(@"User's friends list as will be sent to the server is : %@", **XXXXXXX** );
}
-(void) getUserFacebookFriendsList {
NSMutableString *userFBFriends = [[NSMutableString alloc] init];
[FBRequestConnection startWithGraphPath:@"/me/friends" parameters:nil HTTPMethod:@"GET" completionHandler:^(FBRequestConnection *connection, id result, NSError *error) {
for (NSDictionary *friendData in [result objectForKey:@"data"])
{
NSMutableString *friendId = [friendData objectForKey:@"id"];
[userFBFriends appendString:friendId];
[userFBFriends appendString:@";"];
// This will call -didLoadFacebookFriends on the main thread.
__weak __typeof(self) weakSelf = self;
dispatch_async(dispatch_get_main_queue(), ^{
[weakSelf didLoadFacebookFriends:userFBFriends];
});
}
}];
}
-(void) didLoadFacebookFriends:(NSMutableString *)facebookFriends {
// Do your stuff here.
NSLog(@"The list of friends is : %@",facebookFriends);
}
现在我的问题是如何才能在实际调用getUserFacebookFriendsList的main函数中打印好友列表? 因为看起来像我在函数中所做的NSLOG调用&#34; loginViewFetchedUserInfo&#34;在朋友列表生成之前运行。 如果您在上面的代码中看到我将其标记为BOLD。
提前感谢您的帮助!
答案 0 :(得分:0)
您需要知道您的代码不能在一行中运行。代码中有一些部分(FBRequestConnection
)将与其他代码并行运行。这称为concurrency。你必须等到FBRequestConnection
完成。
这是您的更新代码:
- (void)loginViewFetchedUserInfo:(FBLoginView *)loginView
user:(id<FBGraphUser>)user {
NSLog(@"test login facebook");
NSLog(@"the facbook user borthday is : %@",[user birthday]);
NSLog(@"The FACEBOOK user ID is : %@", [user objectID]);
NSLog( @"### running FB sdk version: %@", [FBSettings sdkVersion] );
[self getUserFacebookFriendsList];
}
-(void) getUserFacebookFriendsList {
NSLog("%@", @"Requesting facebook friends");
[FBRequestConnection startWithGraphPath:@"/me/friends" parameters:nil HTTPMethod:@"GET" completionHandler:^(FBRequestConnection *connection, id result, NSError *error) {
NSLog("%@", @"Request finished.");
NSMutableString *userFBFriends = [[NSMutableString alloc] init];
for (NSDictionary *friendData in [result objectForKey:@"data"]) {
NSMutableString *friendId = [friendData objectForKey:@"id"];
[userFBFriends appendString:friendId];
[userFBFriends appendString:@";"];
}
NSLog(@"%@", @"Finished parsing. Will call didLoadFacebookFriends:");
__weak __typeof(self) weakSelf = self;
dispatch_async(dispatch_get_main_queue(), ^{
[weakSelf didLoadFacebookFriends:userFBFriends];
});
}];
}
-(void) didLoadFacebookFriends:(NSString *)facebookFriends {
NSLog(@"The list of friends is : %@",facebookFriends);
// Do what you need to do.
}