0

私がプログラムを動作させる方法は、AFHTTPClient を介してデータをプログラムに取り込むことです。次に、応答データを取得します。次に、このデータを取得し、NSJSONSerialization を介して NSMutableArray に解析します。この配列は、UIPickerView を設定するために使用されます。

このメソッドは、ユーザーがアプリを開くか、更新ボタンを押すと起動します。問題は、アプリが開いたときに呼び出しが行われ、データが返されることです。ピッカーに行くと空に見えますが、下にスクロールすると5つのうち2つがそこにあり、上にスクロールすると他の人も入ります。いつでも更新ボタンを押すと、エラーがなくなり、ピッカーに適切に入力されます。正常に動作しない理由はありますか? 各呼び出しが行われた後も、AllComponents をリロードします。

-(void) getData{
// Paramaters
NSString *lat = @"40.435615";
NSString *lng = @"-79.987872";
NSDictionary *params = [NSDictionary dictionaryWithObjectsAndKeys: lat, @"lat", lng, @"lng", nil];

// posting the data and getting the response
AFHTTPClient *client = [[AFHTTPClient alloc] initWithBaseURL:[NSURL URLWithString:@"http://mysite.com/"]];
[client postPath:@"/mypostpath.php" parameters:params success:^(AFHTTPRequestOperation *operation, id responseObject) {
    NSString *text = [[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding];
    NSLog(@"Response: %@", text);

    NSError *error;
    json = [NSJSONSerialization JSONObjectWithData:responseObject options:kNilOptions error:&error];

    // setting the first location to the text feild
    NSDictionary* name = [json objectAtIndex:0];
    locationField.text = [name objectForKey:@"name"];

} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
    NSLog(@"%@", [error localizedDescription]);
}];


// reload the picker
[pickerCust reloadAllComponents];

// setting the first location to the text feild
NSDictionary* name = [json objectAtIndex:0];
locationField.text = [name objectForKey:@"name"];

}

4

1 に答える 1

1

問題は[pickerCust reloadAllComponents];、データをロードするブロックが終了する前に が呼び出されているためです。呼び出しをsuccessブロックに移動します。

UI コンポーネントと対話するdispatch_asyncため、メイン キューで実行されるようにラップします。

dispatch_async(dispatch_get_main_queue(), ^{
    [pickerCust reloadAllComponents];
});
于 2013-03-13T18:35:57.967 に答える