2013-04-15 45 views
3

我剛剛切換到AFNetworking來處理我的應用程序中的所有網絡。然而,它現在似乎是阻塞主線程,所以我的MBProgressHUD不會旋轉,直到操作完成後,我的pullToRefreshView也不會動畫,直到操作之後。我將如何解決這個問題?iOS AFNetworking阻止主線程

- (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

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; {被後臺線程調用。

1

默認情況下,AFNetworking在主線程上調用成功/失敗塊(網絡操作在後臺線程上運行後)。這對於您的代碼只需更新用戶界面的常見情況很方便。如果您需要對結果執行一些更復雜的操作(如解析一個大的XML文檔),那麼您可以指定一些其他應該運行回調的調度隊列。有關更多信息,請參閱the documentation

更新(2016年2月11日):自從我發佈這個答案後,AFNetworking在近三年內發生了很大變化:AFHTTPRequestOperation在當前版本(3.0.4)中不再存在。我更新了這個鏈接,所以它沒有被破壞,但你今天完成類似事情的方式可能完全不同。

+0

您的鏈接已過期,請更新它。 – riddhi