我刚刚切换到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];
}
答案 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; {
。