Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 在后台线程中创建视图控制器_Ios_Objective C_Multithreading_Uiscrollview - Fatal编程技术网

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垃圾都应该发生在主线程上,所以如果你的应用程序突然出现问题,我不会感到惊讶。