Iphone 在按下UIViewController之前,如何预加载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

背景:该应用的基本理念是以类似于Snapchat的方式向朋友发送内容。这个应用程序已经可以运行了,但现在我正在尝试一些性能改进。现在,在生成内容的屏幕上选择“下一步”按钮后,会出现延迟,因为正在按下的视图控制器必须加载大约30个单元格的UITableView。这是我之前加速过渡的尝试:

- (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的方法中的任何相关代码