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 は、この回答を投稿してからほぼ 3 年でかなり変更されました: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 に答える