如果我从viewDidLoad调用[self requestData];
,那么我的表就可以很好地填充数据。如果我将[self requestData];
移动到viewDidAppear方法,则表保持为空。
另外,我不完全确定[self.mainTableView reloadData];
是否有效。我正在尝试将数据请求和处理移动到viewDidAppear方法,因为我在代码示例中看到了这种模式,并认为它可能会加速我的应用程序启动。目前,从应用程序启动Default.png到rootViewController还有很长的时间。
感谢您的帮助。
-(void)viewDidAppear:(BOOL)animated
{
[self requestData];
}
-(void)requestData {
[HUD showUIBlockingIndicatorWithText:@"Fetching JSON"];
NSError *requestError = nil;
NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL
URLWithString:kURL]];
NSData *response = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:&requestError];
NSError *jsonParsingError = nil;
if (requestError)
{
NSLog(@"sync. request failed with error: %@", requestError);
}
else
{
// handle data
publicData = [NSJSONSerialization JSONObjectWithData:response
options:0
error:&jsonParsingError];
publicDataArray = [publicData objectForKey:@"data"];
}
/*
for(publicDataDict in publicDataArray) {
NSLog(@"data output is %@",[publicDataDict objectForKey:@"title"]);
}
*/
[self.mainTableView reloadData];
NSLog(@"reload table cat id %@", categoryString);
[HUD hideUIBlockingIndicator];
}
答案 0 :(得分:2)
你正试图优化错误的东西。
你有一个滞后的原因是你的url请求是同步的,所以它在等待接收数据时阻塞主线程。使用异步URL请求将为您提供更好的性能优势,可以像您尝试的那样移动加载调用。
答案 1 :(得分:1)
viewDidLoad
是提出JSON请求的正确位置,因为它被调用一次,并将数据保存到内存中。
ViewDidAppear
,它实际上并不是为了保留对象
“滞后”是因为JSON帖子请求在主线程上,因此您的UI没有响应。
答案 2 :(得分:0)
viewDidLoad
在创建视图后调用,但在绘制之前调用。
viewDidAppear
。在这里设置影响显示的数据为时已晚。您可以在viewWillAppear
中加载数据,但请注意,可能会多次调用该数据(例如,在应用之间切换)。
这就是设置影响显示效果的数据在viewDidLoad
中工作的原因,而不是viewDidAppear
。 viewDidLoad
在视图控制器的生命周期中只被调用一次。
但是,如果用户的Internet连接速度很慢或服务器响应缓慢,请考虑用户体验。您的应用程序似乎会“冻结”一段时间。
请考虑使用异步请求,而不是同步请求。您可以在请求返回之前显示“加载”消息,微调器或其他内容,然后直接更新UI。
Apple强烈建议在从主UI线程运行时始终发出异步请求。
答案 3 :(得分:0)
加速启动尝试异步加载数据,如下所示:
[[NSOperationQueue mainQueue] addOperationWithBlock:^{
[self requestData];
}];
你应该在viewDidLoad
中调用它