Ios 在后台线程中创建视图控制器
我有一个Ios 在后台线程中创建视图控制器,ios,objective-c,multithreading,uiscrollview,Ios,Objective C,Multithreading,Uiscrollview,我有一个UIScrollView。当它完成减速后,我需要创建一个新的UIViewController实例。问题是,虽然这是创建(大约需要1秒),我不能滚动,我的UI感觉不太流畅。我正在考虑在后台线程中创建这个视图控制器。这是个好主意吗?我还需要在它被创建后做一些工作,这项工作必须在主线程上完成。如果我在创建控制器的方法上使用dispatch\u async,然后在视图控制器上使用dispath\u sync(主队列)执行我必须执行的工作,那么dispatch\u sync会等到异步工作完成后执行
UIScrollView
。当它完成减速后,我需要创建一个新的UIViewController
实例。问题是,虽然这是创建(大约需要1秒),我不能滚动,我的UI感觉不太流畅。我正在考虑在后台线程中创建这个视图控制器。这是个好主意吗?我还需要在它被创建后做一些工作,这项工作必须在主线程上完成。如果我在创建控制器的方法上使用dispatch\u async,然后在视图控制器上使用dispath\u sync(主队列)执行我必须执行的工作,那么dispatch\u sync会等到异步工作完成后执行吗
tl;dr I在scrollview中做了很多工作,但它会导致scrollview的滚动性能较差。如何提高性能
样本:
- scrollViewDidEndDecelerating {
dispatch_async(background) {
[self createVC];
[self performSelectorOnMainThread:(setupView)];
}
}
需要更多的代码,看看为什么在启动UIVIewController时scrollView会停止,顺便说一下:
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, NULL), ^{
// This is happening in the background thread.
// create view controller
dispatch_async(dispatch_get_main_queue(), ^{
// This is happening on the main thread; all UI updates must happen here.
// here setup view
});
});
此外,您还可以在初始化scrollView并将其保存在局部变量中时创建ViewController,当它减速时,只需设置视图即可。是的,您可以调度\u async来创建UIViewController,创建完视图控制器后,使用performSelectorOnMainThread在主线程上执行操作,并将视图控制器添加到scrollView中 使用performSelectorOnMainThread
[self performSelectorOnMainThread:@selector(setupView) withObject:(id) waitUntilDone:YES/NO];
是/否取决于您的要求是您可以调度\u async来创建UIViewController,创建完视图控制器后,使用performSelectorOnMainThread在主线程上执行操作,并将视图控制器添加到scrollView。我为问题添加了一个示例。它会工作吗?它通常应该是这样的[self-performSelectorOnMainThread:@selector(setupView)with-Object:(id)waitUntilDone:YES/NO];是/否取决于您的要求。@Priyatham51 Yeh,我明白了,我只是在写一些伪代码:)我会试试看,如果有效,会把它标记为答案。这是一个相当糟糕的主意。Facebook写了整个图书馆的东西。UIKit文档声明所有UI垃圾都应该发生在主线程上,所以如果你的应用程序突然出现问题,我不会感到惊讶。