2015-01-03 50 views
0

我是iOS开发新手,我正尝试将我的应用程序与Facebook集成。 我已经通过登录的步骤,现在我正在尝试获取用户朋友列表。保存Facebook的好友 - iOS

我需要在';'分隔列表中的用户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; 
} 

现在,当我调试电话,我可以看到,我得到了用户的朋友,但问题是,当我得到回报statemtn,好像我的变量“ 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的主要功能要打印的? 因为它再次好像我在函数“loginViewFetchedUserInfo”中执行的NSLOG调用在甚至生成好友列表之前正在运行。 如果您在上面的代码中看到我用BOLD标记了它。

在此先感谢您的帮助!

回答

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. 
} 
+0

塞巴斯蒂安感谢您的伟大的答案。它帮助我更好地理解它,但我仍然遇到问题,我只是用一些新的代码和问题编辑了我的原始帖子。我会感谢任何帮助。 –

+0

不客气。我更新了我的代码段。 –

+0

谢谢塞巴斯蒂安!我想我现在都准备好了!非常感谢您的快速响应和帮助。 –