iOS AFNetworking阻塞主线程

时间:2013-04-15 03:14:53

标签: ios multithreading networking afnetworking mbprogresshud

我刚刚切换到AFNetworking来处理我的应用程序中的所有网络。但是,现在它似乎阻塞了主线程,所以我的MBProgressHUD在操作完成之后才会旋转,我的pullToRefreshView也不会在操作之后动画。我该如何解决这个问题?

- (void)pullToRefreshViewShouldRefresh:(PullToRefreshView *)view; {

    // Call the refreshData method to update the table
    [dataController refreshData];
}


- (void)refreshData {

    NSURLRequest *request = [NSURLRequest requestWithURL:[FCDataController parserURL]];

    NSLog(@"URL = %@", request);

    AFXMLRequestOperation *operation = [AFXMLRequestOperation XMLParserRequestOperationWithRequest:request

    success:^(NSURLRequest *request, NSHTTPURLResponse *response, NSXMLParser *XMLParser) {

        _calls = [[NSMutableArray alloc] init];

        XMLParser.delegate = self;
        [XMLParser parse];
    }

    failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, NSXMLParser *XMLParser) {

        if ([delegate respondsToSelector:@selector(refreshDataDidFailWithError:)]) {
            [delegate refreshDataDidFailWithError:error];
        }

    }];
    [operation start];
}

2 个答案:

答案 0 :(得分:1)

默认情况下,AFNetworking调用主线程上的成功/失败块(在后台线程上运行网络操作之后)。这对于您的代码只需要更新UI的常见情况很方便。如果您需要对结果执行更复杂的操作(例如解析大型XML文档),则可以指定应在其上运行回调的其他调度队列。有关详情,请参阅the documentation

更新(2016年2月11日):自从我发布这个答案后,AFNetworking在近三年内发生了相当大的变化:AFHTTPRequestOperation在当前版本(3.0.4)中不再存在。我已经更新了链接,所以它没有被破坏,但是你现在完成类似工作的方式可能会大不相同。

答案 1 :(得分:0)

MBProgressHUD在哪里被调用?您使用的是SSPullToRefresh还是其他一些实现。我正在为当前项目编写非常相似的代码,并且它的工作非常好。

- (BOOL)pullToRefreshViewShouldStartLoading:(SSPullToRefreshView *)view {
    return YES;
} 

- (void)pullToRefreshViewDidStartLoading:(SSPullToRefreshView *)view {
    [self refresh];
}

- (void)refresh {
    NSURL* url = [NSURL URLWithString:@"some_url_here"];
    NSURLRequest* request = [NSURLRequest requestWithURL:url];
    AFJSONRequestOperation* operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) {
        // consume response

        [_pullToRefreshView finishLoading];
        [self.tableView reloadData];
    } failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, id JSON) {
    }];
    [operation start];

我的猜测是从后台线程调用- (void)pullToRefreshViewShouldRefresh:(PullToRefreshView *)view; {