保存Facebook好友 - iOS

时间:2015-01-03 21:48:34

标签: ios facebook facebook-graph-api

我是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。

提前感谢您的帮助!

1 个答案:

答案 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.
}