tableView 无法以 json 格式显示从网络解析的数据
tableView unable to display data parsed from the web in json format
我使用 kimono 创建了一个 api,这是我的代码。
#import "PlayerRankingsTableViewController.h"
#import "RankingsTableViewCell.h"
#define kBgQueue dispatch_get_global_queue (DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)
#define kPlayerRankingsURL [NSURL URLWithString:@"https://www.kimonolabs.com/api/bg6tcuuq?apikey=xgp4nU6xA9UcBWSe0MIHcBVbAWz5v4wR"]
@interface PlayerRankingsTableViewController () {
}
@property (nonatomic, strong) NSArray *playerRankings;
@end
@implementation PlayerRankingsTableViewController
- (void)viewDidLoad {
[super viewDidLoad];
dispatch_async(kBgQueue, ^{
NSData *data = [NSData dataWithContentsOfURL:
kPlayerRankingsURL];
[self performSelectorOnMainThread: @selector(initializePlayerRankingsArray:)
withObject:data waitUntilDone:YES];
});
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be rexrcreated.
}
- (NSArray *)initializePlayerRankingsArray:(NSData *)responseData {
NSError* error;
NSDictionary *json = [NSJSONSerialization
JSONObjectWithData:responseData
options:kNilOptions
error:&error];
NSArray *myPlayerRankings = [[json objectForKey:@"results"]objectForKey:@"collection1"];
self.playerRankings = myPlayerRankings;
NSLog(@"%@", self.playerRankings);
return self.playerRankings;
}
#pragma mark - Table view data source
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
return 1;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
return [self.playerRankings count];
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
RankingsTableViewCell *cell = (RankingsTableViewCell *)[tableView dequeueReusableCellWithIdentifier:@"cell"];
if (cell == nil) {
cell = (RankingsTableViewCell *)[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"cell"];
}
NSDictionary *rankings = [self.playerRankings objectAtIndex: indexPath.row];
NSString *rank = [rankings objectForKey:@"rank"];
NSString *name = [rankings objectForKey:@"name"];
NSString *points = [rankings objectForKey:@"points"];
[cell.playerRank setText:rank];
cell.playerName.text = name;
cell.playerPoints.text = points;
return cell;
}
@end
我认为数据解析过程没有问题,因为控制台正确显示了我从网络解析的数据。
但是,当我 运行 应用程序时,我只看到一个空的 table。
同样,我认为这对编程来说可能是简单的新事物。
提前谢谢你,很抱歉给你带来这样的负担。
在 initializePlayerRankingsArray:
中,您不应该返回数组,因为那里没有任何东西可以接收它。你已经设置了self.playerRankings
,那就够了。
这个方法缺少的是[self.tableView reloadData];
(应该是设置self.playerRankings
后的最后一行)。
我使用 kimono 创建了一个 api,这是我的代码。
#import "PlayerRankingsTableViewController.h"
#import "RankingsTableViewCell.h"
#define kBgQueue dispatch_get_global_queue (DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)
#define kPlayerRankingsURL [NSURL URLWithString:@"https://www.kimonolabs.com/api/bg6tcuuq?apikey=xgp4nU6xA9UcBWSe0MIHcBVbAWz5v4wR"]
@interface PlayerRankingsTableViewController () {
}
@property (nonatomic, strong) NSArray *playerRankings;
@end
@implementation PlayerRankingsTableViewController
- (void)viewDidLoad {
[super viewDidLoad];
dispatch_async(kBgQueue, ^{
NSData *data = [NSData dataWithContentsOfURL:
kPlayerRankingsURL];
[self performSelectorOnMainThread: @selector(initializePlayerRankingsArray:)
withObject:data waitUntilDone:YES];
});
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be rexrcreated.
}
- (NSArray *)initializePlayerRankingsArray:(NSData *)responseData {
NSError* error;
NSDictionary *json = [NSJSONSerialization
JSONObjectWithData:responseData
options:kNilOptions
error:&error];
NSArray *myPlayerRankings = [[json objectForKey:@"results"]objectForKey:@"collection1"];
self.playerRankings = myPlayerRankings;
NSLog(@"%@", self.playerRankings);
return self.playerRankings;
}
#pragma mark - Table view data source
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
return 1;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
return [self.playerRankings count];
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
RankingsTableViewCell *cell = (RankingsTableViewCell *)[tableView dequeueReusableCellWithIdentifier:@"cell"];
if (cell == nil) {
cell = (RankingsTableViewCell *)[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"cell"];
}
NSDictionary *rankings = [self.playerRankings objectAtIndex: indexPath.row];
NSString *rank = [rankings objectForKey:@"rank"];
NSString *name = [rankings objectForKey:@"name"];
NSString *points = [rankings objectForKey:@"points"];
[cell.playerRank setText:rank];
cell.playerName.text = name;
cell.playerPoints.text = points;
return cell;
}
@end
我认为数据解析过程没有问题,因为控制台正确显示了我从网络解析的数据。 但是,当我 运行 应用程序时,我只看到一个空的 table。 同样,我认为这对编程来说可能是简单的新事物。
提前谢谢你,很抱歉给你带来这样的负担。
在 initializePlayerRankingsArray:
中,您不应该返回数组,因为那里没有任何东西可以接收它。你已经设置了self.playerRankings
,那就够了。
这个方法缺少的是[self.tableView reloadData];
(应该是设置self.playerRankings
后的最后一行)。