Objective c 预加载模态视图控制器

Objective c 预加载模态视图控制器,objective-c,Objective C,有没有一种方法可以在不显示模态视图控制器的情况下预加载它? 我这样问是因为当我显示模态视图控制器(分配和初始化视图控制器类)时,视图的加载和显示会有一点延迟。 之后,当我再次尝试显示它时,延迟停止 我使用的是UITableView,在方法ScrollViewDiEndDraging中,我检查contentOffset.y是否小于-90。如果是这样,用户基本上是“拉动刷新”,那么我正在加载视图。您可以调用ViewWillDisplay,viewDidLoad手动加载。 您可以使用UINib将XIB

有没有一种方法可以在不显示模态视图控制器的情况下预加载它? 我这样问是因为当我显示模态视图控制器(分配和初始化视图控制器类)时,视图的加载和显示会有一点延迟。 之后,当我再次尝试显示它时,延迟停止


我使用的是
UITableView
,在方法
ScrollViewDiEndDraging
中,我检查
contentOffset.y
是否小于-90。如果是这样,用户基本上是“拉动刷新”,那么我正在加载视图。

您可以调用ViewWillDisplay,viewDidLoad手动加载。

  • 您可以使用
    UINib
    将XIB预加载到内存中
它将把XIB的对象树预解码到内存中,但不会实例化XIB中的对象。然后可以调用
UINib
instantiate
方法来实例化视图

  • 您还可以通过调用
    UIViewController
    view
    getter方法强制加载
    view
    (因为视图是延迟加载的,所以第一次访问它时将从XIB加载)
但是,由于您只能在主线程上实例化UI对象(从您的XIB),因为每个UI组件和UI操作都必须在主线程中完成,因此在加载视图时,您的应用程序仍将“冻结”(阻止主线程)。例如,您不能在单独的线程或队列中加载XIB的根UIView(如果您尝试这样做,将出现运行时异常)



使用Instruments及其“Time Profiler”工具检查XIB文件的加载过程到底需要多少时间。(可能这很容易解决,或者可能您会有一些组件,只有在视图显示后才可以延迟加载,等等)。

您可以加载视图上的所有内容,然后显示它


或者,您可以加载modalview的所有属性,然后使用方法显示它。使视图成为属性。

您可以尝试访问视图,这将使viewDidLoad方法被调用,尽管这不是应该做的事情

//Preload
YourViewController * controller = [[YourViewController alloc] init];
controller.view.backgroundColor = [UIColor whiteColor];

.
.
.
.

//Load Controller after time
[self presentModalViewController:controller animated:YES];

PS:我知道有很多这样的问题,但没有人给出真正的解决方案。调用
view会出现
,而
viewDidLoad
不会从XIB加载任何内容。调用
视图
getter方法将失败,因为
UIViewController
的视图是延迟加载的(仅在第一次需要时从XIB加载),因此显式查询它将从XIB加载。但无论如何,您只能在主线程上执行此操作(因为所有UI加载都必须在主线程中完成),因此这仍然会在某个点冻结UI(仅在更早的时候,当您调用
视图
getter方法并强制加载视图时,而不是当您要求显示
UIViewController
时)请注意,这仍然会阻止主线程,并在加载视图时冻结应用程序。唯一的区别是,它将在您访问
视图
属性时冻结,而不是在您调用
presentModalViewController:animated:
方法时冻结。然后您不需要预加载它,您需要使代码更快我昨天开始编码,我自己的代码不超过30行。请注意,在
ScrollViewDiEndDraging
中预加载
控制器没有任何意义,为了看到任何改进,您可以将其放在mainController ViewDiLoad或AppDelegate中,但正如AliSoftware所说,它会阻止UI,因此,当用户没有注意到你的应用程序时,你必须分析它的位置。我已经试过了,看起来延迟没有停止。看一下编辑。当我试图在用户停止拖动时加载一个视图时,0.2秒的延迟是非常糟糕的。实际上并没有真正解决。我认为这是一个正确的答案,因为你的提示是访问时间分析器,这确实帮助我认识到,无论什么情况下,视图仍然会冻结(甚至毫秒)。是的,但正如所解释的,无论你尝试什么,从XIB加载UI元素必须/始终只能在主线程上完成,而不能在单独的线程/队列上完成,就像对UI元素的任何操作一样。因此,在加载UI元素时,如果不冻结主线程,就无法加载XIB,因此这是无法解决的。唯一的伪解决方案是,如果您设法解决了加载缓慢的原因(例如,如果您自己的
awakeFromNib
覆盖的某个实现花费了太多时间,或者您可以调整的任何其他代码),则解决加载缓慢的原因