将对象存储到NSMutableArray中

ncr*_*ins 0 objective-c nsmutablearray ios

我正在尝试构建一个示例应用程序,它从URL中抓取一些json并将其显​​示在表视图中.我在将数据存储到对象中并将这些对象插入NSMutableArray时遇到问题.

TableView.m

- (void) getDataFromAPI {
    NSString *endpoint = @"http://www.somesite.com/list.php";

    NSURL *url = [NSURL URLWithString:endpoint];
    NSURLRequest *request = [NSURLRequest requestWithURL:url];


    AFJSONRequestOperation *operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) {
        [self createMovies: JSON];
    } failure:^(NSURLRequest *request, NSHTTPURLResponse *response , NSError *error , id JSON){
        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Alert" message:@"Uh oh, there's been a problem!" delegate:nil cancelButtonTitle:@"Cancel" otherButtonTitles:@"Retry", nil];
        [alert show];
    }];
    [operation start];
}

- (void) createMovies: (id) json {

    NSMutableArray *list = [[NSMutableArray alloc] init];
    for (id entry in json) {
        Movie *aMovie = [[Movie alloc] init];
        aMovie.movieId = [entry objectForKey:@"id"];
        aMovie.title = [entry objectForKey:@"title"];
        aMovie.director = [entry objectForKey:@"director"];
        aMovie.price = [entry objectForKey:@"price"];

        aMovie = nil;
    }
    NSLog(@"%@", list);
    self.movieList = list;
}

- (void)viewDidLoad
{
    self.movieList = [[NSMutableArray alloc] init];
    [super viewDidLoad];

    [self getDataFromAPI];
    self.title = @"Movies";


    NSLog(@"%@", self.movieList);
}
Run Code Online (Sandbox Code Playgroud)

当我尝试检查self.movieListviewDidLoad它具有零个对象,但是当我检查listcreateMovies,我得到六个对象.

我的json数据的一个例子:

[
  {
    "id": 1,
    "title": "Transformers",
    "price": 29.54,
    "Director": "Michael Bay"
  },
  {
    "id": 2,
    "title": "South Park",
    "price": 34.88,
    "author": "Matt Stone, Trey Parker"
  },
  {
    "id": 3,
    "title": "The Hobbit",
    "price": 20.04,
    "author": "Peter Jackson"
  }
]
Run Code Online (Sandbox Code Playgroud)

bbu*_*bum 5

AFJSONRequestOperation是异步加载数据.因此,当[错误命名 - 应该只是loadDataFromAPI] getDataFromAPI方法返回时,数据尚未实际加载.

您的createMovies:方法应该触发UI刷新,导致电影显示.

  • 但是同样的问题.您正在异步加载某些内容并在加载之前打印出结果. (3认同)
  • @creminsn是的,一旦数据以异步方式加载完成,就调用`createMovies`.如上所述,问题出在`viewDidLoad`中.当您在`viewDidLoad`中记录影片时,数据尚未加载,因为它在后台正在进行中. (3认同)
  • @creminsn你没有.`viewDidLoad`不应该关心什么时候完成.`viewDidLoad`简单地开始加载.你的`createMovies`处理完成.如果需要重新加载表视图,请在`createMovies`的末尾执行此操作.但请确保在主线程上调用`reloadData`.你的`createMovies`可以在后台线程上调用(根据需要查看文档). (2认同)