Ios 等待显示子视图,然后处理,然后删除子视图
我花了一个星期的时间想弄明白怎么做 我要做的是显示一个子视图,然后对后端进行http调用,然后删除子视图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
...
//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完成当前迭代后才会刷新。直到你的方法被留下,这才发生 这是代码运行时发生的情况:
- 用户界面由系统更新
- 您的方法已输入
- 添加视图
- 调度块
- 等待块完成
- 删除视图
- 留下你的方法
- 用户界面由系统更新
[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之前显示警报。我会把它弄得乱七八糟的。非常感谢!