2015-11-05 50 views
1

我有一个IOS应用程序,让用户刷过几周的笔记。每周都是一个UIViewController - 视图控制器之间的滑动和切换由UIPageViewController处理。许多视图控制器 - 性能问题

在启动时,所有的视图控制器都会初始化其数据。

当用户刷我GRAP这样的视图控制器:

func pageViewController(pageViewController: UIPageViewController, viewControllerBeforeViewController viewController: UIViewController) -> UIViewController? { 
    if let currentPageViewController = viewController as? SinglePageViewController { 
     let currentIndex = currentPageViewController.index 
     return self.weeks[currentIndex - 1] 
    } 
    return nil 
    } 

该应用程序工作无瑕疵,直到使用有许多周,由此许多视图控制器。启动时间开始成为一个问题 - 随着这几周的进行,这种情况只会变得更糟。

我玩过每个视图控制器初始化当用户滑动。就像这样:

func pageViewController(pageViewController: UIPageViewController, viewControllerBeforeViewController viewController: UIViewController) -> UIViewController? { 
     if let currentPageViewController = viewController as? SinglePageViewController { 
      let currentIndex = currentPageViewController.index 
      let newVC = SinglePageViewController() 
      newVC.index = currentIndex - 1 
      return newVC 
     } 
     return nil 
     } 

这种方法适用和启动时间是伟大的 - 但是,刷卡现在已经变得迟缓和不顺畅的。

任何人都可以建议如何解决这个问题?

+0

你可以尝试设置它,一旦你的应用程序达到某个点(视图控制器的数量),它开始回收旧的视图控制器显示未来几周的笔记。 –

+1

而不是在你滑动时初始化视图控制器,你应该在每个方向初始化一对,而不是仅仅是下一个。 – pbush25

+0

@ twist295,你有这样的例子吗? – Rasmus

回答

0

第二种方法(按需创建)是正确的方法。如果转换变慢,那么因为你在init(),viewDidLoad,viewWillAppear等中花费了很多CPU时间......查看初始化并将每个CPU密集型任务移动到后台线程。

如果您依赖数据来创建ViewController,那么您必须预先预加载数据。但不需要预先加载超过2或3个数据的数据。如果花费很长时间并且仍然遇到性能问题,那么您必须接受该设备的速度不足以满足您的要求,并且必须向用户提供加载指示符。 (如UIActivityIndi​​cator)

如果您在优化初始化方面需要帮助,请发布您的代码。

+0

伟大的建议 - 这解决了我的问题 – Rasmus

0

我有一个类似的问题,在UIScrollView中使用太多的UIScrollViews。我的解决方案是通过使用scrollViewDidScroll委托方法监视用户在哪里寻找,连接到我的容器滚动视图,并根据用户的滚动方向填充/删除视图。

您可以从方法中的let direction = scrollView.panGestureRecognizer.translationInView(scrollView.superview!)中获取方向。

这种类型的方法适合你吗?如果你愿意,我可以给你更多的代码!