【问题标题】:Unable to retain data even using __block即使使用 __block 也无法保留数据
【发布时间】:2016-04-02 07:24:50
【问题描述】:

我使用 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 在 cmets 中所说的那样,我意识到 AFNetworking 运行在与主线程不同的线程上,而主线程恰好在其他所有线程之前执行。

但是,我仍然不知道如何解决这个问题。我应该创建一个函数来处理这个问题吗?

【问题讨论】:

  • 您应该阅读 IO 中的队列。块successfailure 在服务器响应数据之后在后台队列中执行。外部 NSLog 在 [manager ....] 命令后立即在主线程中执行。这是关于 IOs 中的线程和队列的相关链接。我认为你应该在使用 AFNetworking 之前先阅读它link
  • 啊..我明白了。有什么办法可以解决这个问题吗?
  • 我不知道你想对从服务器返回的 Json 做什么。如果你需要处理Json返回,通过globar变量保存(我的be是你的_object),写一个函数来处理它。在success 块内,您调用[weakSelf handleData]
  • 我正在考虑将名为 _objects 的变量(在实现上方的接口块中声明)设置为这个 responseObject
  • 我对Objective-C的了解并不多,所以把代码放在一个我应该做的单独函数上会不会太麻烦?

标签: ios objective-c afnetworking


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    您需要在 success 块内初始化 _objects。你可以像下面那样做。

    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);
    }];
    

    【讨论】:

    • 嗨;抱歉,我无法尽快回复。即使我在块内分配了_objects,我仍然在块外保留数据时遇到问题。还有其他原因吗?
    • 如果你想对 _objects 变量的值做一些事情,你可以把它放在一个方法中,然后在成功块内的 _objects = [[responseObject allKeysForObject:@"type"] mutableCopy]; 语句之后立即调用该方法。这样,您甚至可以在初始化之前避免使用_objects。希望这会对你有所帮助。
    猜你喜欢
    • 1970-01-01
    • 2023-03-28
    • 2021-03-09
    • 1970-01-01
    • 2023-03-31
    • 2020-08-28
    • 1970-01-01
    • 2019-09-11
    • 1970-01-01
    相关资源
    最近更新 更多