我一直在使用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运行的是一个与主要不同的线程,它恰好在其他所有内容之前执行。
但是,我仍然不知道如何解决这个问题。我应该做一个处理这个的功能吗?答案 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);
}];