尝试在 UITableView 中加载大量 JSON 数据需要很长时间
Posted
技术标签:
【中文标题】尝试在 UITableView 中加载大量 JSON 数据需要很长时间【英文标题】:Trying to load large amount of JSON data in UITableView taking much time 【发布时间】:2017-05-31 11:20:06 【问题描述】:我是 ios 新手,一直在尝试在 UITableView 中加载 JSON 数据(在 UIViewController 中,在标签栏控制器中)。 JSON 数据很大,我也尝试过使用AFNetworking
库。但数据仍然需要超过 15 秒。加载。
这是我尝试过的: 方法#2
@implementation AppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
// Override point for customization after application launch.
[self saveData];
return YES;
-(void) saveData
NSString * userType= @"3" ;
NSString * userID= @"33" ;
NSString * URLString = [NSString stringWithFormat:@"http://<some_url>/%@/%@/",userType,userID];
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
manager.responseSerializer =[AFHTTPResponseSerializer serializer];
[manager GET:leadsURLString parameters:nil progress:nil success:^(NSURLSessionTask *task, NSData* responseObject)
NSError * error = nil;
NSArray * lData = [NSJSONSerialization JSONObjectWithData:responseObject options:NSJSONReadingAllowFragments error:&error];
NSLog(@"Leads:%@",lData);
if (error != nil)
NSLog(@"JSON Error: %@", [error localizedDescription]);
// Write the file .
NSArray * paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString * docDirectory = [paths objectAtIndex:0];
NSString * lFilePath = [NSString stringWithFormat:@"%@",[docDirectory stringByAppendingPathComponent:@"leads"]]; // File
if (![leadsData writeToFile:lFilePath atomically:YES])
NSLog(@"Couldn't save leads data.");
failure:^(NSURLSessionTask *operation, NSError *error)
NSLog(@"Error: %@", error);
];
@end
Code for tableView
@implementation ViewController
- (void)viewDidLoad
[super viewDidLoad];
// Uncomment the following line to preserve selection between presentations.
// self.clearsSelectionOnViewWillAppear = NO;
// Uncomment the following line to display an Edit button in the navigation bar for this view controller.
// self.navigationItem.rightBarButtonItem = self.editButtonItem;
NSArray * paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString * docDirectory = [paths objectAtIndex:0];
NSString * projFilePath = [NSString stringWithFormat:@"%@",[docDirectory stringByAppendingPathComponent:@"leads"]]; // file
if ([[NSFileManager defaultManager] fileExistsAtPath:projFilePath])
_projects = [[NSMutableArray alloc] initWithContentsOfFile:projFilePath];
else
_projects = [NSMutableArray arrayWithObject:[NSDictionary dictionaryWithObject:@"No Project" forKey:@"project_name"]];
[self.tableView reloadData];
最初尝试在视图控制器加载时加载数据,耗时太长。
然后尝试在 Appdelegate 中加载数据并保存,并在视图控制器加载时加载,仍然花费了足够长的时间。
尝试在 Appdelegate 中加载数据,然后在各自的视图控制器中进行设置,但无法实现。
谁能提出最好的方法来完成它?
【问题讨论】:
添加尝试过的代码。 添加了尝试过的代码。 如果获取数据需要很长时间,可能是网速或服务器问题。你不能做任何事情!一旦你得到回应,你应该重新加载你的表格视图,就是这样!你这边就完成了! 我正在我的 viewControllers 中这样做,重新加载 tableView。正如您所说,这可能是一个问题,因为正在加载大约 6000 多条记录。但这对于 JSON 数据来说太过分了吗? 添加在tableview中显示的代码。 【参考方案1】:如果数据大得多(正如您在评论中提到的),那么您可以管理您的api
,例如您可以将最后一个索引发送到服务器,服务器从该索引返回数据,您可以定义应该返回的记录总数一次通话。那么您可以在用户滚动您的表格视图时经常调用api
!
例如,您可以考虑facebook app's time line
或Quora app's read
选项卡!
【讨论】:
我可能需要与其他团队核实这一点。感谢所有的帮助,@Lion。欣赏它。【参考方案2】:尝试按照以下步骤减少时间。
步骤:1 尝试从下面加载数据,检查需要多长时间。
AFHTTPSessionManager *managerFB = [AFHTTPSessionManager manager];
[managerFB GET:WEB_SERIVCE_URL parameters:dicData progress:^(NSProgress * _Nonnull downloadProgress)
<#code#>
success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject)
NSLog(@"%@",responseObject);
failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error)
<#code#>
];
步骤:2:不要尝试将数据保存到本地文件中。在 AppDelegate 中创建一个全局变量并直接存储到其中。
步骤:3:尝试在后台线程中调用服务,这样你的主应用程序界面就不会卡住了。
[self performSelector:@selector(yourMethodName) withObject:nil afterDelay:0.2];
另外,您可以在 Postman 中查看您的网络服务响应时间,这是 Chrome 的扩展。因此,您可以从服务中获得响应时间。
【讨论】:
也试过这种方法,速度有点快,但只有 2 秒。感谢您的回复@Nirmalsinh。 你能给我网址和请求数据吗?所以我可以检查一下。 我很想这样做,但商业条款和限制禁止我这样做。希望你能理解。谢谢@Nirmalsinh,感谢您的帮助 你可以检查一件事,如果你得到更多的数据,那么试着分成小块。因此,加载不会花费更多时间。另外,如果你使用 tableview 并且你的单元格大小相同,那么不要编写 heightForCell 方法,直接从情节提要中给出静态高度。 不幸的是,我使用的是自定义单元格,但我在情节提要中设置了高度。以上是关于尝试在 UITableView 中加载大量 JSON 数据需要很长时间的主要内容,如果未能解决你的问题,请参考以下文章
无法在 Playground 中加载 UITableView
Facebook 在 uitableview 中加载相册,但未在下一个收藏视图中打开