1

次のコードは、サーバー (実際には、現在自分のマシン) に接続し、データをダウンロードしてシリアル化を解除し、グローバル変数に割り当てます。

UINavigationController *navController = (UINavigationController *)self.window.rootViewController;
MasterViewController *masterController = [navController.viewControllers objectAtIndex:0]; // masterController is a UITableViewController subclass
NSMutableArray *surveys = [[NSMutableArray alloc] init];
NSURL *url = [NSURL URLWithString:@"http://127.0.0.1:8000/testapp/survey-data"];
NSURLRequest *request = [NSURLRequest requestWithURL:url];
[NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *rep, NSData *d, NSError *err) {
    if(d) {
        NSMutableArray *allSurveys = [NSJSONSerialization JSONObjectWithData:d options:NSJSONReadingMutableContainers | NSJSONReadingMutableLeaves error:nil];
        for(NSMutableArray *item in allSurveys) {
            NSString *title = [item objectAtIndex:[item count] - 1];
            [item removeLastObject];
            Survey *survey = [[Survey alloc] initWithArray:item title:title];
            [surveys addObject:survey];
        }
        masterController.surveys = surveys;


        NSLog(@"%@", [masterController.surveys description]);
    }
}];

残念ながら、それは機能していません。(NSLog()ハンドラー ブロック内) は、期待どおり、すべてのデータを出力します。接続が機能していることは明らかです。ただし、ビューは更新されず、行はすべて空白です。ダウンロードが完了した後にブロックが呼び出されているために、これが発生していますか? どうすればこれを回避できますか?

また、ブロックに変数を設定したことが原因のようです。ただし、Apple のドキュメントを調べたところ、 への参照を介して配列を設定しているため、これは問題ではないようですmasterViewController。私が間違っている?

これを a を使用するように書き直そうとしたことに注意してください[NSURLConnection sendSynchronousRequest:returningResponse:error:。これはうまく機能しました。ただし、ネットワークが低速またはダウンしている場合、同期要求はひどい考えになる可能性があるため、これを非同期で機能させる必要があります。

4

2 に答える 2

1

AsynchronousRequestUI の更新が行われるメイン スレッドを使用しないため、UI の更新には次を使用します。

dispatch_async(dispatch_get_main_queue(), ^{ 
    //UI update here    
});
于 2012-05-28T10:05:38.930 に答える
1

reloadDataビューはデータを取得する前に読み込まれるため、データが到着した後にテーブル ビューを呼び出す必要があります。

UIKit クラスはスレッド セーフではないため、他の問題を防ぐために、メイン スレッドでこれを行っていることを確認してください。

于 2012-05-28T15:14:42.890 に答える