在后台线程中创建视图控制器

时间:2014-12-05 13:02:33

标签: ios objective-c multithreading uiscrollview

我有UIScrollView。当它完成减速时,我需要创建一个UIViewController的新实例。问题是,虽然这是创建(大约需要1秒),但我无法滚动,我的UI感觉不那么流畅。我正在考虑在后台线程中创建这个视图控制器。这是个好主意吗?在创建它之后我还需要做一些工作,这项工作必须在主线程上完成。如果我在创建控制器的方法上使用dispatch_async,然后使用dispath_sync(主队列)进行我必须在视图控制器上完成的工作,dispatch_sync会等到我的异步工作完成后才执行吗?

tl; dr我在scrollViewDidEndDecelerating中做了很多工作,但它导致我的scrollview滚动性能不佳。如何提高性能?

样品:

- scrollViewDidEndDecelerating {
    dispatch_async(background) {
         [self createVC];
         [self performSelectorOnMainThread:(setupView)];
    }
}

2 个答案:

答案 0 :(得分:0)

需要更多代码哟看看为什么你的scrollView在你启动UIVIewController时停止了,但顺便说一下:

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并将其保存在局部变量中,当它减速时,只需设置你的视图。

答案 1 :(得分:0)

是的,你可以使用dispatch_async创建你的UIViewController,当你完成创建视图控制器时,使用performSelectorOnMainThread在mainthread上执行你的操作并将你的视图控制器添加到你的scrollView。

使用performSelectorOnMainThread

[self performSelectorOnMainThread:@selector(setupView) withObject:(id) waitUntilDone:YES/NO];

是/否取决于您的要求