大佬教程收集整理的这篇文章主要介绍了ios – Objective C – 循环后删除/隐藏NSProgressIndicator,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
>进度条变得可见
>使用循环更新进度条
>进度条消失了
这是我的代码:
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND,0),^{ progressBar.hidden = NO; for (NSInteger i = 1; i <= progressBar.maxValue; i += 20){ [NSThread sleepForTimeInterval:1.0]; dispatch_async(dispatch_get_main_queue(),^{ [progressBar setDoubleValue:(doublE)i]; [progressBar displayIfNeeded]; }); } progressBar.hidden = YES; });
进度条在我的ViewController.h中以这种方式定义:
NSProgressInDicator * progressBar
问题是在循环结束时没有删除栏,我不知道progressBar.hidden = YES;这样工作.
有人能帮我吗?代码片段非常有用,特别是如果后面有解释的话.
首先,除非你拥有该线程或确切知道它具有哪些职责,否则睡眠线程不是正确的做法.队列的线程由GCD拥有,您应该将工作保持在队列级别而不是较低级别. (来自主队列的块将始终在主线程上运行.在某些情况下,尽管有限,但是全局队列中的块可能无法在后台线程上运行.*)
其次,你问的问题的原因是:在后台线程上,你的隐藏设置是非主线程上的UI操作.这是不允许的,因为它可能导致UI状态中的同步问题.除了主线程之外,修改Cocoa中的视图外观是不安全的.
你有一半的问题,调用setDoubleValue:call的主队列,但设置hidden也需要在主线程上.
for循环不是更新屏幕的好机制.我建议重新修改你的程序,重复调用一个方法. NSTimer专为您正在做的事情而打造.您应该毫不费力地找到使用它的示例.
如果您想使用GCD,我建议切换使用单个dispatch_after()调用,在主队列延迟后重复运行一个Block.像这样的东西:
- (void)kickItOff { self.progressBar.hidden = NO; [self updateProgress:0]; } - (void)updateProgress:(doublE)progressvalue { if( self.progressBar.maxValue <= progressvalue ){ self.progressBar.hidden = YES; return; } dispatch_time_t onesecond = dispatch_time(DISPATCH_TIME_Now,(int64_t)(1 * NSEC_PER_SEC)); dispatch_after(onesecond,dispatch_get_main_queue(),^{ [self.progressBar setDoubleValue:progressvalue]; [self updateProgress:progressvalue + 20]; }); }
您可以通过调用kickItOff来启动更新周期.然后updateProgress:安排循环.这使主线程和运行循环继续无阻碍地工作,同时确保代码以您想要的间隔运行.
*在这一点上更深入:为了实际将uI绘制到屏幕上,主运行循环需要循环.如果主线程处于休眠状态,则不会发生这种情况:整个UI都被锁定以用于绘制和接受输入(并且主分派队列也未被处理).
以上是大佬教程为你收集整理的ios – Objective C – 循环后删除/隐藏NSProgressIndicator全部内容,希望文章能够帮你解决ios – Objective C – 循环后删除/隐藏NSProgressIndicator所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。