Iphone 在按下UIViewController之前,如何预加载UITableView?
背景:该应用的基本理念是以类似于Snapchat的方式向朋友发送内容。这个应用程序已经可以运行了,但现在我正在尝试一些性能改进。现在,在生成内容的屏幕上选择“下一步”按钮后,会出现延迟,因为正在按下的视图控制器必须加载大约30个单元格的UITableView。这是我之前加速过渡的尝试:Iphone 在按下UIViewController之前,如何预加载UITableView?,iphone,ios,uitableview,uinavigationcontroller,uipageviewcontroller,Iphone,Ios,Uitableview,Uinavigationcontroller,Uipageviewcontroller,背景:该应用的基本理念是以类似于Snapchat的方式向朋友发送内容。这个应用程序已经可以运行了,但现在我正在尝试一些性能改进。现在,在生成内容的屏幕上选择“下一步”按钮后,会出现延迟,因为正在按下的视图控制器必须加载大约30个单元格的UITableView。这是我之前加速过渡的尝试: - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view fro
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view from its nib.
self.selectFriendsViewController = [[MPOSelectFriendsViewController alloc]
initWithNibName:@"MPOSelectFriendsViewController"
bundle:nil];
[self.selectFriendsViewController awakeFromNib];
}
按下“下一步”按钮时:
- (void)gotoFriendsPage {
[self.navigationController pushViewController:self.selectFriendsViewController animated:YES];
}
我想做什么:Snapchat始终以零延迟的方式预装好友列表,如下所示:
显然,他们使用UIPageViewController而不是UINavigationController来实现这种效果,但我的问题是:
1。如果我将备份控制器从UINavigationController更改为UIPageViewController,这种零延迟加载会自动进行吗
2.有没有办法通过UINavigationController获得这样的零延迟加载时间
提前感谢您的帮助
编辑:请求我的表格视图单元格FORROWATINDEXPATHcode:
static NSString *cellIdentifier = @"FriendSelectionCell";
MPOFriendSelectionCell *cell = (MPOFriendSelectionCell *)[tableView dequeueReusableCellWithIdentifier:cellIdentifier];
if (cell == nil) {
cell = [[MPOFriendSelectionCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier];
}
MPOUser *friend = [self.friendManager.recentFriends objectAtIndex:indexPath.row];
if(friend != (MPOUser *)[NSNull null]) {
cell.currentFriend = friend;
cell.friendLabel.text = friend.fullName;
}
return cell;
这个问题没有一个单一的解决方案。 您需要实现缓存,并在加载UI时立即在UI上显示该信息。有很多方法可以缓存数据。您可以使用NSUserDefaults(我不建议对大数据使用此选项)或。之后,您需要延迟加载所有新信息,并找到一种智能方法来更新已表示数据的单元格上的信息,并为UITableView中尚未表示的新数据插入新行 与您的情况相关的电话包括: 上述方法采用索引路径数组和UITableViewRowAnimation。对于索引路径,您可以执行类似以下操作:
[NSArray arrayWithObjects:[nsindepath indexPathForRow:0第0节],[nsindepath indexPathForRow:1第0节],/*等等*/nil]代码>
我建议对重新加载的行使用UITableViewRowAnimationFade
,对插入或删除行使用UITableViewRowAnimationTop
/UITableViewRowAnimationBottom
最初加载视图控制器时,请使用缓存的信息渲染单元。在viewDidLoad中,生成一个后台调用,下载/加载新数据,完成后,动态更新UITableView
这里唯一的缺点是,在第一次加载时,将没有数据显示。您可以通过加载一些默认数据或占位符数据来避开这一步,以便用户在加载实际数据时可以使用一些东西
很抱歉,这里没有多少代码可以发布。你的问题没有一个包罗万象的解决方案,你可以用多种方法来解决这个问题。我的答案是最好的方法,但我相信还有很多其他方法可以解决这个问题
另外,在instruments中运行时间分析器。。。它将帮助您了解应用程序的哪个部分消耗的时间最多。我在这种情况下所采用的方法(我从外部来源获取数据)是将用于表视图
数据源的数组
保存到NSUserDefaults
,然后在触发viewDidLoad
时首先加载该数组。之后,我调用我的web服务获取新数据,并将从NSUserDefaults
加载的Array
与我从web服务获得的刚下载的Array
进行比较。如果他们相等,什么也不做。如果它们不同,请更新表视图
,并将最新数据保存回NSUserDefaults
即使对于大型数据集(8000条记录),这种方法也能快速有效地工作。您能为表视图单元格提供ROWATINDEXPATH代码吗?它不应该加载全部30个单元格,但如果您写得正确,只加载屏幕上的单元格。只需添加。你说得对,它实际上并没有一次加载所有30个单元格。iOS 6.1应用程序的最低要求版本是6.0,这听起来肯定可以加快速度。目前,我使用“[NSKeyedArchiver archiveRootObject:self.friends toFile:[self-friendsarchivepath]”在好友管理器中缓存数据“NSUserDefaults”更快吗?我还没有做过性能测试和基于文件的缓存,但我敢打赌是的。您所做的只是(最多)用新阵列替换阵列。我有一个应用程序可以缓存8000行数组(电话簿),当它加载新数据时,几乎无法察觉。谢谢你的回复。我目前正在使用[NSKeyedArchiver archiveRootObject:self.friends-toFile:[self-friendsarchivepath]]在我的好友管理器中缓存数据代码>但即使好友列表没有更改,每次我点击“后退”,然后再点击“下一步”,它仍然很慢。在MPOFIENDSELECTIONCELL中,我看到您有一个“currentFriend”的setter。那个二传手有什么习惯吗?你能从你的单元的实现文件中发布代码吗?我之所以问这个问题,是因为到目前为止,您似乎只是在更新单元格的UILabel上的文本。在这种情况下,不应拖延。另外,当您使用MPOUser*friend='[self.friendManager.recentFriends objectAtIndex:indexPath.row];'从FriendsManager读取数据时,这是在读取磁盘上的缓存副本吗?重复访问缓存可能会很慢。如何在一个数组中预加载所有信息?另外,在instruments中运行时间分析器。。。它将帮助你了解应用程序的哪个部分消耗的时间最多。我给你一个。如果你想要一个高质量的应用程序,使用Profiler是绝对必要的。事实上,我建议你不要这样做。loadView和viewDidLoad作为UIViewController生命周期的一部分自动调用。移动那些你认为可能是cal的方法中的任何相关代码