0

我使用 AFNetworking 用 youtube 视频填充 UITableView。YouTube API 只允许每个请求最多 50 个结果。所以我必须使用多个 URL 来获得超过 50 个结果。

我创建了一个方法,它将在给定的 URL 上执行 AFNetworkings AFJSONRequestOperation。

我认为 UITable 是在我收到 JSON 数据之前创建的。在我创建方法之前,一切都运行良好。

这是我第一次创建一个方法。在过去的几天里,我一直在尝试在 UITable 上加载 50 多个 youtube 视频。请查看我的代码。

这是我的代码,你也可以从这里下载整个项目

QQViewController.m

-(void)viewWillAppear:(BOOL)animated {

    [super viewWillAppear:animated];
    //[super viewDidLoad];

    NSString *urlAsString = @"http://gdata.youtube.com/feeds/api/playlists/PL7CF5B0AC3B1EB1D5?v=2&alt=jsonc&max-results=50";


    // I am not sure how i am supposed to populate the uitableview with the second link :(

     NSString *urlAsString2 = @"http://gdata.youtube.com/feeds/api/playlists/PL7CF5B0AC3B1EB1D5?v=2&alt=jsonc&max-results=50&start-index=51";



    self.myurl = [NSURL URLWithString:urlAsString];

    [self getJSONfromURL:self.myurl];

[self.tableView reloadData];

}

-(void)viewDidAppear:(BOOL)animated {

        [super viewDidAppear:animated]; 

        self.videoMetaData = [self.myJSON valueForKeyPath:@"items.video"];

        NSLog(@" QQVC video Meta Data %@", self.videoMetaData);


        self.allThumbnails = [self.myJSON valueForKeyPath:@"data.items.video.thumbnail"];


        // The table need to be reloaded or else we will get an empty table.

        [self.tableView reloadData]; // Must Reload

        // NSLog(@" video Meta Data %@", self.videoMetaData);


}

// 这里是方法

-(void)getJSONfromURL:(NSURL *)url {

    NSURLRequest *request = [NSURLRequest requestWithURL:url];
    // setup AFNetworking stuff
    AFJSONRequestOperation *operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) {
        // call delegate or processing method on success

       // [self.myJSON = (NSArray *)JSON];

        self.myJSON = [JSON valueForKey:@"data"];
        [self.tableView reloadData];
       //NSLog(@" in get JSon method %@", self.myJSON);

    } failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, id JSON) {
        NSLog(@"Request Failed with Error: %@, %@", error, error.userInfo);
    }];


    [operation start];



}

- (void)viewDidLoad
{
    [super viewDidLoad];
}
4

2 回答 2

1

getJSONfromURL: 方法中有几个问题。主要问题是您将 self.myJSON 定义为 [JSON valueForKey:@"data"],但随后将 self.allThumbnails 定义为 [self.myJSON valueForKeyPath:@"data.items.video.thumbnail"] - 您使用再次“数据”,所以 self.thumbnails 为空。这似乎工作正常:

-(void)getJSONfromURL:(NSURL *)url {
    NSURLRequest *request = [NSURLRequest requestWithURL:url];
    // setup AFNetworking stuff
    AFJSONRequestOperation *operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) {
        self.myJSON = [JSON valueForKey:@"data"];
        self.allThumbnails = [self.myJSON valueForKeyPath:@"items.video.thumbnail"];
        self.videoMetaData = [self.myJSON valueForKeyPath:@"items.video"];
        [self.tableView reloadData];

    } failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, id JSON) {
        NSLog(@"Request Failed with Error: %@, %@", error, error.userInfo);
    }];

    [operation start];
}

如果你想从多个 URL 加载日期,你可以这样做。我添加了一个计数器来跟踪 URL 字符串数组的进度。每次下载后都会重新加载该表,因此不必等待整个过程完成后才会显示一些数据。

@interface QWViewController ()
@property (strong,nonatomic) NSArray *urlStrings;
@end

@implementation QWViewController {
    int counter;
}


-(void)viewDidLoad {
    [super viewDidLoad];
    counter = 0;
    NSString *urlAsString = @"http://gdata.youtube.com/feeds/api/playlists/PL7CF5B0AC3B1EB1D5?v=2&alt=jsonc&max-results=50";
    NSString *urlAsString2 = @"http://gdata.youtube.com/feeds/api/playlists/PL7CF5B0AC3B1EB1D5?v=2&alt=jsonc&max-results=50&start-index=51";
    self.urlStrings = @[urlAsString,urlAsString2];
    self.allThumbnails = [NSMutableArray array];
    self.videoMetaData = [NSMutableArray array];
    [self getJSONFromURL:self.urlStrings[0]];
}


-(void)getJSONFromURL:(NSString *) urlString {
    NSURL *url = [NSURL URLWithString:urlString];
    NSURLRequest *request = [NSURLRequest requestWithURL:url];
    AFJSONRequestOperation *operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) {
        self.myJSON = [JSON valueForKey:@"data"];
        [self.allThumbnails addObjectsFromArray:[self.myJSON valueForKeyPath:@"items.video.thumbnail"]];
        [self.videoMetaData  addObjectsFromArray:[self.myJSON valueForKeyPath:@"items.video"]];
        [self.tableView reloadData];
        counter += 1;
        if (counter < self.urlStrings.count) [self getJSONFromURL:self.urlStrings[counter]];
    }

    failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, id JSON) {
    NSLog(@"Request Failed with Error: %@, %@", error, error.userInfo);
    }];
    [operation start];
}
于 2013-02-14T05:09:28.637 回答
0

将您的 reload tableview 调用移至此处。

-(void)getJSONfromURL:(NSURL *)url {

    NSURLRequest *request = [NSURLRequest requestWithURL:url];
    // setup AFNetworking stuff
    AFJSONRequestOperation *operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) {
        // call delegate or processing method on success

       // [self.myJSON = (NSArray *)JSON];

        self.myJSON = [JSON valueForKey:@"data"];
        [self.tableView reloadData];
       //NSLog(@" in get JSon method %@", self.myJSON);

    } failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, id JSON) {
        NSLog(@"Request Failed with Error: %@, %@", error, error.userInfo);
    }];


    [operation start];



}
于 2013-02-14T03:12:55.623 回答