我是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];
}
最初尝试在视图控制器加载时加载数据,耗时太长。
然后尝试在Appdelegate中加载数据并保存,并在视图控制器加载时加载它仍然需要足够长的时间。
- 醇>
尝试在Appdelegate中加载数据,然后在相应的视图控制器中设置它,但无法实现。
有人能建议最好的方法吗?
答案 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 line
或Quora app's read
标签!