即使使用__block也无法保留数据

时间:2016-04-02 07:24:51

标签: ios objective-c afnetworking

我一直在使用AFNetworking库已经有一段时间了,我遇到了一个问题。我使用以下代码,它使用GET函数从远程PHP文件接收数据。

AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
manager.responseSerializer.acceptableContentTypes = [NSSet setWithObject:@"text/html"];
__block NSDictionary *data = nil;

[manager GET:@"..." parameters:nil success:^(NSURLSessionTask *task, id responseObject) {
    data = responseObject;
} failure:^(NSURLSessionTask *operation, NSError *error) {
    NSLog(@"Error: %@", error);
}];

_objects = [[data allKeysForObject:@"type"]mutableCopy];

如您所见,我创建了一个本地NSDictionary变量并将其设置为nil,正如另一个Stack Overflow帖子告诉我的那样。在括号内,一切看起来都不错;数据已填满。但是,在括号外,data完全为空。任何想法为什么这可能不起作用?提前谢谢。

修改 正如matiboo在评论中所说的那样,我意识到AFNetworking运行的是一个与主要不同的线程,它恰好在其他所有内容之前执行。

但是,我仍然不知道如何解决这个问题。我应该做一个处理这个的功能吗?

2 个答案:

答案 0 :(得分:1)

您的_object变量应位于成功块内。 因为返回块将在后台线程中执行,所以它需要一定的时间,因此命令_objects = [[data allKeysForObject:@"type"]mutableCopy];将在返回块中的命令(成功或失败)之前被执行。所以,数据仍然是零。

答案 1 :(得分:0)

您的data nil因为_objects = [[data allKeysForObject:@"type"]mutableCopy];将在success块之前执行,因为返回块将在后台线程中执行,这将需要一些时间。

您需要在_objects块内初始化success。你可以这样做。

AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
manager.responseSerializer.acceptableContentTypes = [NSSet setWithObject:@"text/html"];

[manager GET:@"..." parameters:nil success:^(NSURLSessionTask *task, id responseObject) {
    _objects = [[responseObject allKeysForObject:@"type"] mutableCopy];
} failure:^(NSURLSessionTask *operation, NSError *error) {
    NSLog(@"Error: %@", error);
}];