[ios]等待子视图来显示,然后处理,然后删除子视图

发布时间: 2017/3/28 23:37:16
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

我花了一个星期,试图找出如何做到这一点。

想做什么是显示子视图,然后做我对后端的 http 调用,然后在那之后删除子视图。

...
//Display view
[superView addSubview:blurredOverlay];
[superView bringSubviewToFront:blurredOverlay];

//After blurredOverlay is displayed, Try to login the user
dispatch_group_t d_group = dispatch_group_create();
dispatch_queue_t bg_queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_group_async(d_group, bg_queue, ^{
    //Try to login user
    success = [self loginUser];
    NSLog(@"Success=%i", success);
    [NSThread sleepForTimeInterval:10.0]; //here to force thread to not return immediatly
});
dispatch_group_wait(d_group, DISPATCH_TIME_FOREVER);

//Remove the view after the thread is done processing
[blurredOverlay removeFromSuperview];

这不工作。如果我有

[blurredOverlay removeFromSuperview];

取消注释,blurredOverlay 是永远不会显示。如果我对它进行注释,显示 blurredOvleray,但显然无法将其删除。

我的需要是第一,显示 blurredOverlay,然后尝试登录用户 (虽然显示是 blurredOverlay),和 loginUser 返回后,删除模糊的显示。

解决方法 1:

你调度此块到异步队列。你的主线程不会停止,等待,直到完成那块。 但你已经知道的。这就是为什么您使用调度组阻塞主线程,直到完成后台任务。
这种方法的问题在于 runloop 完成当前迭代后才会刷新 UI。不发生直到离开你的方法。

这是您的代码运行时,会发生什么︰

  • 由系统更新 UI
  • 进入你的方法
    • 添加视图
    • 调度块
    • 等待块来完成
    • 删除视图
  • 离开你的方法
  • 由系统更新 UI

你看看这个问题?UI 不更新之间添加视图和删除它。

这里是你应该做什么。你添加的视图。调度与你的任务块,所以它在后台运行。在这背景块的末尾,你派你背景任务完成时将运行的另一个块。那块在主线程上运行,并删除您的视图。

[superView addSubview:blurredOverlay];
dispatch_queue_t backgroundQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_async(backgroundQueue, ^{

    // run your web request here
    [NSThread sleepForTimeInterval:10.0];

    // task is done
    dispatch_async(dispatch_get_main_queue(), ^{
        // UI updates have to run on the main thread, so dispatch the removal
        [blurredOverlay removeFromSuperview];
    });
});
赞助商