3

我最近才切换到 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];
}
4

2 回答 2

1

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

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

于 2013-04-15T05:12:51.550 回答
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; {从后台线程调用。

于 2013-04-15T05:08:47.273 回答