使用 afnetworking 拉 json 时显示加载动画

Posted

技术标签:

【中文标题】使用 afnetworking 拉 json 时显示加载动画【英文标题】:Showing loading animation while pulling json with afnetworking 【发布时间】:2013-06-09 20:05:21 【问题描述】:

我正在尝试使用 MBProgressHUD 在应用程序加载更多 json 数据时弹出加载动画。这是我用来调用包含 MBProgressHUD 的函数的代码。

- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView 
float bottomEdge = scrollView.contentOffset.y + scrollView.frame.size.height;
if (bottomEdge >= scrollView.contentSize.height) 
    pageCounter++;


    [MBProgressHUD showHUDAddedTo:self.view animated:YES];
    dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, 0.01 * NSEC_PER_SEC);
    dispatch_after(popTime, dispatch_get_main_queue(), ^(void)
        // Do something...
        [self loadAdditionalJson];
        [MBProgressHUD hideHUDForView:self.view animated:YES];
    );

    

这里是被调用的函数:

-(void)loadAdditionalJson

NSLog(@"%i", pageCounter);
NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:
                                   @"http://ragetracks.com/?json=1&count=50&page=%i&custom_fields=PostThumb&include=title,content,attachments",
                                   pageCounter]];


NSURLRequest *request = [NSURLRequest requestWithURL:url];
AFJSONRequestOperation *operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) 

    for (int x = 0; x < 50; x++) 
        //NSLog(@"%i", pageCounter*50 -50 + x);
        if ([JSON[@"posts"][x][@"attachments"] count] == 0)
        
            NSString *temp = [NSURL URLWithString:@"nothing"];
            [imageUrls addObject:temp];
        
        else
        
            NSString *temp1;
            //temp1 = [NSString stringWithFormat:@"%@", JSON[@"posts"][x][@"id"]];
            //NSLog(temp1);
            NSURL *imageUrl =  [NSURL URLWithString:
                                [NSString stringWithFormat:@"%@",
                                JSON[@"posts"][x][@"attachments"][0][@"images"][@"medium"][@"url"]]];
           NSString *title = [NSString stringWithFormat:@"%@", JSON[@"posts"][x][@"title"]];

            NSString *label = [NSString stringWithFormat:@"%@", JSON[@"posts"][x][@"content"]];

            NSScanner *scanner = [NSScanner scannerWithString:label];
            [scanner scanUpToString:@"%2Ftracks%2F" intoString:nil];
            [scanner scanString:@"%2Ftracks%2F" intoString:nil];
            [scanner scanUpToString:@"&" intoString:&temp1];

            NSURL *temp2 = [NSURL URLWithString:[NSString stringWithFormat:@"https://api.soundcloud.com/tracks/%@.json?client_id=7622aa84a50c9f7609e2f7ed8bc85e81", temp1]];

            if (imageUrl) 
                [imageUrls addObject:imageUrl];
            
            else
                NSString *temp = [NSURL URLWithString:@"nothing"];
                [imageUrls addObject:temp];
            
            [titles addObject:title];
            [contentUrls addObject:temp2];

        
    
    [self.collectionView reloadData];

 failure:nil];


    [operation start];

加载动画只是出现和消失的太快,并不能反映应用程序加载新信息需要多长时间。我知道它与主线程有关,但我不确定该怎么做。我试过关闭AFNetworkActivityIndicatorManager,但这似乎没有任何影响。睡眠系统会延迟它,但仍然不能正确反映加载时间,因为睡眠后,它会回来并完成加载。

【问题讨论】:

【参考方案1】:

好吧,您是在要求它...您在开始 JSON 加载之前延迟了很短的时间(这似乎没有意义),然后在开始加载后立即关闭进度指示器。

我认为您的困惑在于您认为 JSON 加载是同步完成的 - 但事实并非如此。

所以,删除:

dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, 0.01 * NSEC_PER_SEC);
dispatch_after(popTime, dispatch_get_main_queue(), ^(void)

因为它对你没有帮助。只需在启动 HUD 动画后开始加载。然后,在您处理 JSON 的成功块(JSONRequestOperationWithRequest)中,在扫描代码之后,添加:

[MBProgressHUD hideHUDForView:self.view animated:YES];

如果应该紧跟在[self.collectionView reloadData];之后。

【讨论】:

以上是关于使用 afnetworking 拉 json 时显示加载动画的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 AFNetworking 3.0 在后台下载大文件并在会话完成所有任务时显示本地通知

AFNetworking 可达性在网络状态改变时显示 UIView

iOS Afnetworking 2.0 AfSecurityPolicy.m 在构建项目时显示错误

在 AFHTTPRequestOperation 失败时显示 UIAlertView

如何使用 AFNetworking 进行 json 解析

JSON + AFNetworking [关闭]