0

sendAsyncrhonousRequest を呼び出したときに渡される NSArray の参照を取得しようとしています。その NSArray を取得したら、それをクラス属性に割り当てたいのですが、それができないようです。

@implementation BarTableViewController {
    NSArray *_jsonArray;
}

[NSURLConnection sendAsynchronousRequest:request
                                   queue:[NSOperationQueue mainQueue]
                       completionHandler:^(NSURLResponse *response, NSData *data, NSError *error)
 {

     NSInteger statusCode = [(NSHTTPURLResponse *)response statusCode];

     if (statusCode == 200 && data.length > 0 && error == nil)
     {
         NSError *e = nil;
         NSArray *jsonArray = [NSJSONSerialization JSONObjectWithData: data options: NSJSONReadingMutableContainers error: &e];

         if (!jsonArray) {
             NSLog(@"Error parsing JSON: %@", e);
         } else {
             _jsonArray = jsonArray; // this doesn't work? _jsonArray is at the class level
         }
     }
     else if (error)
     {
         NSLog(@"HTTP Status: %ld", (long)statusCode);
     }
     else if (statusCode != 200)
     {
         NSLog(@"HTTP Status: %ld", (long)statusCode);
     }
 }];

jsonArray をトラバースすると、データが正しく表示されます。後で使用するために _jsonArray に割り当てると、データが返されなくなります。配列のカウントはゼロです。

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return _jsonArray.count; // always returns zero
}

jsonArray をクラス属性に割り当てて、そのデータを後で使用できるようにするにはどうすればよいですか?

4

2 に答える 2

1

私の理論は正しかった。リクエストが完了する前にUIが読み込まれていました。この問題を修正するために私がしたことは

[self.tableView reloadData];

非同期リクエストの内部。

于 2013-03-23T04:18:47.013 に答える
0

単純な代入は忘れてください:

 @implementation BarTableViewController {
   // NSArray *_jsonArray; forget it
}

代わりにオブジェクトを所有します。

@interface BarTableViewController()
@property(nonatomic, strong)NSArray *jsonArray;
@end

/* --------- */

@implementation BarTableViewController
@syntethise jsonArray = _jsonArray;
@end

それを自分のものにする

 self.jsonArray = jsonArray; // will call synthesized setter

ダングリングポインターの代わりにnil値を取得するため、ARCを使用していると思います。これで、有効な jsonArray を取得できます。

于 2013-03-22T08:10:41.677 に答える