无法在startWithCompletionHandler之外检索数据

时间:2014-02-07 19:59:10

标签: ios objective-c

我将Facebook用户信息数据放入 NSMutableArray ,我在请求方法调用中使用 for 循环。问题是我无法在方法调用之外获取数据。 NSLog 中的第一个 self.items 可以显示我想要的数据,其中包含我输入的所有全名。但是, NSLog 中的第二个 self.items 是一个空 NSMutableArray

在.h文件中

@property (strong,nonatomic) NSMutableArray *items;

初始化数组:

self.items = [[NSMutableArray alloc] init];

这是我的代码:

- (IBAction)reloadFriendList:(id)sender {

    FBRequest *request = [FBRequest requestForMyFriends];
    [request startWithCompletionHandler:^(FBRequestConnection *connection, id result, NSError *error) {
        NSString *space = @" ";
        for (id<FBGraphUser> user in result[@"data"]) {
            NSArray *array = [[NSMutableArray alloc] initWithObjects:[user first_name], space, [user last_name], nil];
            NSString *fullName = [array componentsJoinedByString:@""];
            [self.items addObject:fullName];
        }
        NSLog(@"%@",self.items);
    }];
    NSLog(@"%@",self.items);
}

有人能告诉我发生了什么吗?谢谢!

2 个答案:

答案 0 :(得分:3)

我认为你并不完全明白这里发生了什么。完成处理程序块在请求完成时执行,而完成处理程序块之后的NSLog语句在您调用[request startWithCompletionHander ...]之后立即执行。所以这是按时间顺序排列的事件:

  1. 您调用[request startWithCompletionHandler ...]
  2. 执行块外的NSLog(由于请求尚未完成,self.items应为空)
  3. 一旦请求在稍后的任意时间完成,执行完成处理程序块并填充您的self.items,然后NSLog打印出所有项目(如果项目实际在响应中,则应该非空)。

答案 1 :(得分:2)

处理程序是异步的,因此在获取数据之前很久就会进行调用之外的日志消息。