0

我一直在环顾四周,看到类似的帖子,但没有像这样可以给我答案的东西。这是我的应用程序设置和流程:

  1. 用户必须通过 Facebook 登录,使用 Facebook Graph。LoginView 以模态方式呈现,非动画
  2. 当用户登录时,我可以检索 FBID 并使用此 fbid 将其发送到我的网络服务 (REST)
  3. Web 服务从 NSURL 获取 FBID 并将其与数据库匹配以检索其他用户信息
  4. 使用 JSONserialization 我解析从 Web 服务接收到的 JSON 并将其显示在视图中

问题:除了我从 Facebook 获得的 FBID 之外,所有内容都返回 NULL。但是,如果我从 Facebook 注销然后登录,那就是它起作用的时候。

这是我的代码:

viewDidAppear 方法:

-(void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:NO];
    if (FBSession.activeSession.isOpen) {
        [self populateUserDetails];
    }

    //Connect to WebService
    NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@"http://atnightcorp.com/api/member/id/%@/format/json", fbid]];
    NSURLRequest *request = [NSURLRequest requestWithURL:url];
    [NSURLConnection connectionWithRequest:request delegate:self];
    NSArray *pics = [member valueForKeyPath:@"photos"];
    NSString *picCount = [NSString stringWithFormat:@"%d", [pics count]];
    [photosCount setTitle:picCount forState:UIControlStateNormal];

    NSLog(@"PHOTO: %@", picCount);
    NSLog(@"FB: %@", fbid);

}

我尝试将 NSURL 请求和连接代码放在 viewDidLoad 中,但后来我什么也没有得到。

我的 NSURLConnection 方法:

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
{
    data = [[NSMutableData alloc]init];
}

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)theData
{
    [data appendData:theData];
}

- (void)connectionDidFinishLoading:(NSURLConnection *)connection
{
    [UIApplication sharedApplication].networkActivityIndicatorVisible = NO;

    member = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableLeaves error:nil];

}

- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
{
    UIAlertView *errorView = [[UIAlertView alloc]initWithTitle:@"Error" message:@"The download could not complete. Please make sure you are connected to internet" delegate:nil cancelButtonTitle:@"Dismiss" otherButtonTitles:nil];
    [errorView show];
    [UIApplication sharedApplication].networkActivityIndicatorVisible = NO;
}

您在上面看到的 populateUserDetails 方法:

- (void)populateUserDetails
{
    if (FBSession.activeSession.isOpen) {
        [[FBRequest requestForMe] startWithCompletionHandler:
         ^(FBRequestConnection *connection,
           NSDictionary<FBGraphUser> *user,
           NSError *error) {
             if (!error) {
                 self.userProfileImage.profileID = user.id;
                 self.navigationItem.title = user.name;
                 self.fbid = user.id;
             }
         }];
    }
}

一旦用户登录,此方法基本上设置 FBID。您应该知道的其他重要事项可以帮助您理解我的项目:

  • FBID 在我的 .H 文件中设置为 NSString 属性
  • 所有 facebook 连接的事情都在 AppDelegate 中进行
  • 找出用户是谁后,我需要动态设置 NSURL。
  • 如果我在 NSURL 中手动输入 FBID,那么它可以工作。
  • 一切都应该在用户登录时执行,我认为检索 fbid 和从 Web 服务接收数据的时间是错误的,但我无法修复它。
  • 如果您需要其他任何东西,我会详细说明并在需要时发布更多代码。-

请帮忙,因为我过去 3 天一直在寻找答案。

4

1 回答 1

0

你的问题是populateUserDetails被调用并且它在没有等待代码被执行的情况下返回(因为它是一个带有完成处理程序的异步任务,当你第一次调用NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@"http://atnightcorp.com/api/member/id/%@/format/json", fbid]];时,它fbid是无效的或者没有正确设置(你也应该使用self.fbid不是fbid因为fbid是属性)。

因此,您应该尝试将处理请求的整个代码viewDidAppear移到一个单独的方法中,并且应该startWithCompletionHandler在设置行之后调用该方法self.fbid = user.id

[super viewDidAppear:animated];不要使用NO参数调用(这不会解决您的问题,但这是正确的方法)

于 2013-05-22T17:44:16.647 回答