尝试在 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 lineQuora 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

在 UITableView 中加载图像时遇到问题

Facebook 在 uitableview 中加载相册,但未在下一个收藏视图中打开

在 UIView 中加载 UITableView

在 coredata 中加载图像时 UITableView 滞后

数据未在 UITableView 中加载。可能是啥问题?