在第一个视图中立即阻止主线程会导致iOS 8上出现黑屏闪烁

时间:2014-12-31 10:53:11

标签: ios objective-c splash-screen

将以下代码添加到新项目会导致黑屏闪烁。这似乎是由闪屏的淡出动画引起的。不幸的是,漫长的过程必须在主线程上。可以通过延迟来避免它,但它不可靠并延长装载过程。

- (void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];
    // A spinner is shown
    // This most probably will not cause a black screen
//    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
//        [self loadSomething];
//    });

//    This will not cause a black screen but not suitable for my use
//    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
//        [self loadSomething];
//    });

    dispatch_async(dispatch_get_main_queue(), ^{
        [self loadSomething];
    });
}

- (void)loadSomething
{
    NSLog(@"start long process");
    NSDate *start = [NSDate date];
    while (-[start timeIntervalSinceNow] < 5) {

    }
}

2 个答案:

答案 0 :(得分:0)

考虑为什么它必须在主线程上,并提出一种方法来移动此处理或最小化它。

您应该创建一个根视图控制器,它显示应用程序默认图像并显示该视图控制器(可能带有一些动画或进度指示),直到您的处理完成。

答案 1 :(得分:0)

如果您已经在主线程上,那么就不需要异步获取主线程。

dispatch_async(dispatch_get_main_queue(), ^{
});

应删除上述代码。

如果您想要做某事或加载某些内容,那么您应该使用

<强> performSelectorInBackground

希望这会有所帮助......