Ios 等待显示子视图,然后处理,然后删除子视图

Ios 等待显示子视图,然后处理,然后删除子视图,ios,objective-c,xcode,multithreading,ios8,Ios,Objective C,Xcode,Multithreading,Ios8,我花了一个星期的时间想弄明白怎么做 我要做的是显示一个子视图,然后对后端进行http调用,然后删除子视图 ... //Display view [superView addSubview:blurredOverlay]; [superView bringSubviewToFront:blurredOverlay]; //After blurredOverlay is displayed, Try to login the user dispatch_group_t d_group = disp

我花了一个星期的时间想弄明白怎么做

我要做的是显示一个子视图,然后对后端进行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。如果我把它注释掉,就会显示BlurRedoveray,但我显然无法删除它


我需要的是首先显示blurredOverlay,然后尝试登录用户(同时显示blurredOverlay),在登录用户返回后,删除模糊显示。

您正在将此块分配到异步队列。主线程不会停止等待,直到该块完成。 但你已经知道了。这就是为什么在后台任务完成之前使用调度组阻止主线程。
这种方法的问题是,UI只有在runloop完成当前迭代后才会刷新。直到你的方法被留下,这才发生

这是代码运行时发生的情况:

  • 用户界面由系统更新
  • 您的方法已输入
    • 添加视图
    • 调度块
    • 等待块完成
    • 删除视图
  • 留下你的方法
  • 用户界面由系统更新
你看到问题了吗?在添加视图和删除视图之间,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];
    });
});

我尝试了多种不同的dispatch_group_async变体,但我对线程技术还不熟悉,没有任何帮助。与其使用dispatch_group,不如使用NSURLSession或NSURLConnection的sendAsynchronousRequest,并删除完成块中的覆盖。我发誓我也尝试过这种方法。一定没有,因为它工作!!!现在唯一的事情是我的//web请求中有AlertView。它将返回,清除blurredOverlay,然后等待下一个runloop循环显示警报。我需要的是在删除blurredOverlay之前显示警报。我会把它弄得乱七八糟的。非常感谢!