次のコードは、サーバー (実際には、現在自分のマシン) に接続し、データをダウンロードしてシリアル化を解除し、グローバル変数に割り当てます。
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:
。これはうまく機能しました。ただし、ネットワークが低速またはダウンしている場合、同期要求はひどい考えになる可能性があるため、これを非同期で機能させる必要があります。