在 uitableview 中一秒后加载数据。消除这种延迟的任何替代方法
Loading data after one second in uitableview. Any alternate way to eliminate this delay
NSURL *url=[NSURL URLWithString:string];
dispatch_queue_t backgroundQueue = dispatch_queue_create("com.example.workQueue", DISPATCH_QUEUE_SERIAL);
dispatch_async(backgroundQueue, ^{
NSData *data=[NSData dataWithContentsOfURL:url];
NSDictionary *json=[NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:nil];
NSLog(@"%@",json);
marray=[NSMutableArray array];
for (NSDictionary *dict in json) {
}
dispatch_async(dispatch_get_main_queue(), ^{
[self.tableView reloadData];
});
});
这是处理数据并在 Objective C 中重新加载 table 的正确方法吗?如果是,那么我仍然看到在 tableview 上看到数据有些延迟。有什么办法可以消除这种延迟吗?顺便说一句,这是我故事板中的第二个屏幕。
你做得很好。 在后台线程上下载数据并将其交给table视图,在主线程中重新加载数据就是您需要做的。几乎可以肯定是您自己在向 table 提供数据时的延迟(网络延迟和解析时间),而不是 UITabvleView 在处理您的 reloadData 调用时的延迟。
执行此操作时应遵循的一些一般规则:
- 进行服务器调用时在屏幕上显示加载叠加层。
- 返回数据后,将其传递给主线程上的 table 视图。立即移除加载叠加层。
- 不要在
cellForRowAtIndexPath:
方法中做重物。
作为旁注,虽然是同样的事情,但如果您遵循上述所有准则,请尝试使用下面的方法。
[self.tableView performSelectorOnMainThread:@selector(reloadData) withObject:nil waitUntilDone:YES];
NSURL *url=[NSURL URLWithString:string];
dispatch_queue_t backgroundQueue = dispatch_queue_create("com.example.workQueue", DISPATCH_QUEUE_SERIAL);
dispatch_async(backgroundQueue, ^{
NSData *data=[NSData dataWithContentsOfURL:url];
NSDictionary *json=[NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:nil];
NSLog(@"%@",json);
marray=[NSMutableArray array];
for (NSDictionary *dict in json) {
}
dispatch_async(dispatch_get_main_queue(), ^{
[self.tableView reloadData];
});
});
这是处理数据并在 Objective C 中重新加载 table 的正确方法吗?如果是,那么我仍然看到在 tableview 上看到数据有些延迟。有什么办法可以消除这种延迟吗?顺便说一句,这是我故事板中的第二个屏幕。
你做得很好。 在后台线程上下载数据并将其交给table视图,在主线程中重新加载数据就是您需要做的。几乎可以肯定是您自己在向 table 提供数据时的延迟(网络延迟和解析时间),而不是 UITabvleView 在处理您的 reloadData 调用时的延迟。
执行此操作时应遵循的一些一般规则:
- 进行服务器调用时在屏幕上显示加载叠加层。
- 返回数据后,将其传递给主线程上的 table 视图。立即移除加载叠加层。
- 不要在
cellForRowAtIndexPath:
方法中做重物。
作为旁注,虽然是同样的事情,但如果您遵循上述所有准则,请尝试使用下面的方法。
[self.tableView performSelectorOnMainThread:@selector(reloadData) withObject:nil waitUntilDone:YES];