0

私が Objective-C の初心者であると言うのは、非常に控えめな表現です。私は主に Ruby/Rails の開発者ですが、OOP とプログラミング全般に関しては完全に甘やかされています。

チュートリアルを読むのにうんざりした後、NSRULSession を使って自分の Rails アプリ (Elder Scrolls Online スキル プランナー) の 1 つにアクセスし、iOS アプリに JSON 応答の一部を表示することにしました。デリゲートは意味がありません。この機能をメソッドなどに分割する方法がわからないので、シンプルに保ち、すべてを viewDidLoad() メソッドで実行すると考えました (はい、それが悪い習慣であることはわかっています)。

- (void)viewDidLoad {
    [super viewDidLoad];

    __block NSDictionary *skillData; // No clue what __block is

    NSURLSession *session = [NSURLSession sharedSession];
    NSURLSessionDataTask *dataTask = [session dataTaskWithURL:[NSURL URLWithString:@"http://www.esomix.com/skill_builds/17.json"] completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
        NSDictionary *json = [NSJSONSerialization JSONObjectWithData:data options:0 error:nil];
        NSLog(@"%@", json[@"name"]);
        skillData = json;
    }];

    [dataTask resume];

    UILabel *myLabel = [[UILabel alloc] initWithFrame:CGRectMake(50, 100, 200, 100)];
    myLabel.textColor = [UIColor colorWithRed:255.0/255.0 green:255.0/255.0 blue:255.0/255.0 alpha:1];
    [self.view addSubview:myLabel];

    NSLog(@"%@", skillData[@"name"]);
    NSLog(@"bottom of method");
}

いろいろいじってみた結果、下部の NSLogs の前に NSURLSession コードがあるにもかかわらず、レンダリング後にデータが返されることがわかりました。label.text (表示されていません) が設定されていなかったのも不思議ではありません! 3 つの NSLog の順序は次のとおりです。

(null)
bottom of method
Single-Target Lockdown Sniper

私の質問は、JSON API リクエストを作成し、データが返された後にデータを使用して UI 要素/その他のタスクを生成する最も簡単で適切な方法は何かだと思います。本当にありがとう!

4

1 に答える 1