试图在UITableView中加载大量的JSON数据需要花费很多时间

时间:2017-05-31 11:20:06

标签: ios objective-c json uitableview

我是iOS的新手,并且一直在尝试在UITableView中加载JSON数据(在UIViewController中,它们位于Tab栏控制器中)。 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];

}
  
      
  1. 最初尝试在视图控制器加载时加载数据,耗时太长。

  2.   
  3. 然后尝试在Appdelegate中加载数据并保存,并在视图控制器加载时加载它仍然需要足够长的时间。

  4.   
  5. 尝试在Appdelegate中加载数据,然后在相应的视图控制器中设置它,但无法实现。

  6.   

有人能建议最好的方法吗?

2 个答案:

答案 0 :(得分:0)

尝试按照以下步骤缩短时间。

步骤: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:尝试在后台线程中调用服务,这样您的主应用程序UI就不会卡住。

[self performSelector:@selector(yourMethodName) withObject:nil afterDelay:0.2];

另外,您可以在Postman中检查您的网络服务响应时间,这是Chrome的扩展程序。所以你可以从服务中获得响应时间。

答案 1 :(得分:0)

如果数据更大(正如您在评论中提到的那样),那么您可以管理您的api,就像您可以向服务器发送最后一个索引,服务器从该索引返回数据,您可以定义记录的总数在一个电话中回来。然后,当用户滚动您的表格视图时,您可以经常拨打api

例如,您可以考虑facebook app's time lineQuora app's read标签!