使用 NSURL 检索到的数据加载 Table 视图时出现问题
Problems loading Table View with data retrieved using NSURL
我对使用 NSURL 获取数据还是很陌生,每次尝试使用它时似乎都会遇到问题。在这种情况下,我使用调试来检查所有进入 ViewDidload 的日期,所有正确的数据都进入并被分成数组,然后我想用它来构建我的 table 视图控制器。然而,当我们到达 NumberOfRows in section 方法时,所有数组似乎都已重置为 nil。
我尝试过使用 NSURL 解决方案的各种组合,但 none 似乎比我现在使用的解决方案更进一步(至少显示了一些数据到达)。任何人都可以让我知道我是否犯了一个明显的错误,或者如果没有给我一段可靠的代码,我应该使用它来执行像这样的简单 GET。
非常感谢。
下面是我的代码:
@implementation MyLessonsTableViewController
NSArray *pastarr = nil;
NSArray *todoarr = nil;
NSArray *comingarr = nil;
NSArray *jsonless = nil;
- (void)viewDidLoad {
[super viewDidLoad];
// GET MY LESSONS FROM DATABASE
jsonless = [[NSArray alloc] init];
pastarr = [[NSArray alloc] init];
todoarr = [[NSArray alloc] init];
comingarr = [[NSArray alloc] init];
NSString *token = @"5cfd28bed3f5f5bd63143c81a50d434a";
NSString *urlString = [NSString stringWithFormat:@"http://soon.nextdoorteacher.com/apps/api/nextdoorteacher/student-lessons?t=%@", token];
NSURL *urlcc = [NSURL URLWithString:urlString];
NSData *data = [NSData dataWithContentsOfURL:urlcc];
NSError *error;
NSMutableDictionary *jsonLess = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions
error:&error];
dispatch_async(dispatch_get_main_queue(), ^{
[self.tableView reloadData];
});
NSLog(@"My Lessons Json == %@", jsonLess);
// SPLIT ARRAY
NSArray *pastarr = [jsonLess valueForKeyPath:@"past"];
NSArray *todoarr = [jsonLess valueForKeyPath:@"todo"];
NSArray *comingarr = [jsonLess valueForKeyPath:@"upcoming"];
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
// Return the number of sections.
return 3;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
// Return the number of rows in the section.
NSUInteger lessonRowCount = 0;
switch (section) {
case 0:
lessonRowCount = todoarr.count;
break;
case 1:
lessonRowCount = comingarr.count;
break;
case 2:
lessonRowCount = pastarr.count;
break;
default:
break;
}
return lessonRowCount;
}
几个问题。
- 您在
dispatch_async
中不必要地调用了 reloadData
。
- 您在处理
jsonLess
之前调用 reloadData
。
- 你永远不会为你的数组 ivars 分配任何东西。
- 你的数组实际上没有ivars。你有全局变量。
这是您发布的所有已修复代码:
@implementation MyLessonsTableViewController {
NSArray *pastarr = nil;
NSArray *todoarr = nil;
NSArray *comingarr = nil;
}
- (void)viewDidLoad {
[super viewDidLoad];
// GET MY LESSONS FROM DATABASE
NSString *token = @"5cfd28bed3f5f5bd63143c81a50d434a";
NSString *urlString = [NSString stringWithFormat:@"http://soon.nextdoorteacher.com/apps/api/nextdoorteacher/student-lessons?t=%@", token];
NSURL *urlcc = [NSURL URLWithString:urlString];
NSData *data = [NSData dataWithContentsOfURL:urlcc];
NSError *error;
NSMutableDictionary *jsonLess = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions
error:&error];
NSLog(@"My Lessons Json == %@", jsonLess);
// SPLIT ARRAY
pastarr = [jsonLess valueForKeyPath:@"past"];
todoarr = [jsonLess valueForKeyPath:@"todo"];
comingarr = [jsonLess valueForKeyPath:@"upcoming"];
[self.tableView reloadData];
}
现在这个还有一个大问题。您正在主线程上进行 Internet 访问。那很糟。你真的应该这样做:
- (void)viewDidLoad {
[super viewDidLoad];
// GET MY LESSONS FROM DATABASE
NSString *token = @"5cfd28bed3f5f5bd63143c81a50d434a";
NSString *urlString = [NSString stringWithFormat:@"http://soon.nextdoorteacher.com/apps/api/nextdoorteacher/student-lessons?t=%@", token];
NSURL *urlcc = [NSURL URLWithString:urlString];
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
NSData *data = [NSData dataWithContentsOfURL:urlcc];
NSError *error;
NSMutableDictionary *jsonLess = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions
error:&error];
NSLog(@"My Lessons Json == %@", jsonLess);
// SPLIT ARRAY
pastarr = [jsonLess valueForKeyPath:@"past"];
todoarr = [jsonLess valueForKeyPath:@"todo"];
comingarr = [jsonLess valueForKeyPath:@"upcoming"];
// Now this must be done on the main thread
dispatch_async(dispatch_get_main_queue(), ^{
[self.tableView reloadData];
});
}};
}
我对使用 NSURL 获取数据还是很陌生,每次尝试使用它时似乎都会遇到问题。在这种情况下,我使用调试来检查所有进入 ViewDidload 的日期,所有正确的数据都进入并被分成数组,然后我想用它来构建我的 table 视图控制器。然而,当我们到达 NumberOfRows in section 方法时,所有数组似乎都已重置为 nil。 我尝试过使用 NSURL 解决方案的各种组合,但 none 似乎比我现在使用的解决方案更进一步(至少显示了一些数据到达)。任何人都可以让我知道我是否犯了一个明显的错误,或者如果没有给我一段可靠的代码,我应该使用它来执行像这样的简单 GET。 非常感谢。
下面是我的代码:
@implementation MyLessonsTableViewController
NSArray *pastarr = nil;
NSArray *todoarr = nil;
NSArray *comingarr = nil;
NSArray *jsonless = nil;
- (void)viewDidLoad {
[super viewDidLoad];
// GET MY LESSONS FROM DATABASE
jsonless = [[NSArray alloc] init];
pastarr = [[NSArray alloc] init];
todoarr = [[NSArray alloc] init];
comingarr = [[NSArray alloc] init];
NSString *token = @"5cfd28bed3f5f5bd63143c81a50d434a";
NSString *urlString = [NSString stringWithFormat:@"http://soon.nextdoorteacher.com/apps/api/nextdoorteacher/student-lessons?t=%@", token];
NSURL *urlcc = [NSURL URLWithString:urlString];
NSData *data = [NSData dataWithContentsOfURL:urlcc];
NSError *error;
NSMutableDictionary *jsonLess = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions
error:&error];
dispatch_async(dispatch_get_main_queue(), ^{
[self.tableView reloadData];
});
NSLog(@"My Lessons Json == %@", jsonLess);
// SPLIT ARRAY
NSArray *pastarr = [jsonLess valueForKeyPath:@"past"];
NSArray *todoarr = [jsonLess valueForKeyPath:@"todo"];
NSArray *comingarr = [jsonLess valueForKeyPath:@"upcoming"];
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
// Return the number of sections.
return 3;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
// Return the number of rows in the section.
NSUInteger lessonRowCount = 0;
switch (section) {
case 0:
lessonRowCount = todoarr.count;
break;
case 1:
lessonRowCount = comingarr.count;
break;
case 2:
lessonRowCount = pastarr.count;
break;
default:
break;
}
return lessonRowCount;
}
几个问题。
- 您在
dispatch_async
中不必要地调用了reloadData
。 - 您在处理
jsonLess
之前调用reloadData
。 - 你永远不会为你的数组 ivars 分配任何东西。
- 你的数组实际上没有ivars。你有全局变量。
这是您发布的所有已修复代码:
@implementation MyLessonsTableViewController {
NSArray *pastarr = nil;
NSArray *todoarr = nil;
NSArray *comingarr = nil;
}
- (void)viewDidLoad {
[super viewDidLoad];
// GET MY LESSONS FROM DATABASE
NSString *token = @"5cfd28bed3f5f5bd63143c81a50d434a";
NSString *urlString = [NSString stringWithFormat:@"http://soon.nextdoorteacher.com/apps/api/nextdoorteacher/student-lessons?t=%@", token];
NSURL *urlcc = [NSURL URLWithString:urlString];
NSData *data = [NSData dataWithContentsOfURL:urlcc];
NSError *error;
NSMutableDictionary *jsonLess = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions
error:&error];
NSLog(@"My Lessons Json == %@", jsonLess);
// SPLIT ARRAY
pastarr = [jsonLess valueForKeyPath:@"past"];
todoarr = [jsonLess valueForKeyPath:@"todo"];
comingarr = [jsonLess valueForKeyPath:@"upcoming"];
[self.tableView reloadData];
}
现在这个还有一个大问题。您正在主线程上进行 Internet 访问。那很糟。你真的应该这样做:
- (void)viewDidLoad {
[super viewDidLoad];
// GET MY LESSONS FROM DATABASE
NSString *token = @"5cfd28bed3f5f5bd63143c81a50d434a";
NSString *urlString = [NSString stringWithFormat:@"http://soon.nextdoorteacher.com/apps/api/nextdoorteacher/student-lessons?t=%@", token];
NSURL *urlcc = [NSURL URLWithString:urlString];
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
NSData *data = [NSData dataWithContentsOfURL:urlcc];
NSError *error;
NSMutableDictionary *jsonLess = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions
error:&error];
NSLog(@"My Lessons Json == %@", jsonLess);
// SPLIT ARRAY
pastarr = [jsonLess valueForKeyPath:@"past"];
todoarr = [jsonLess valueForKeyPath:@"todo"];
comingarr = [jsonLess valueForKeyPath:@"upcoming"];
// Now this must be done on the main thread
dispatch_async(dispatch_get_main_queue(), ^{
[self.tableView reloadData];
});
}};
}