iOS中使用NSProgress类来创建UI进度条的方法详解
来源:互联网 发布:施明德 知乎 编辑:程序博客网 时间:2024/05/24 04:51
转自:http://www.jb51.net/article/86774.htm
一、引言
在iOS7之前,系统一直没有提供一个完整的框架来描述任务进度相关的功能。这使得在开发中进行耗时任务进度的监听将什么麻烦,在iOS7之后,系统提供了NSProgress类来专门报告任务进度。
二、创建单任务进度监听器
单任务进度的监听是NSProgress最简单的一种运用场景,我们来用定时器模拟一个耗时任务,示例代码如下:
上面的示例代码中,fractionCompleted属性为0-1之间的浮点值,为任务的完成比例。NSProgress对象中还有两个字符串类型的属性,这两个属性将进度信息转化成固定的格式:
三、创建多任务进度监听器
上面演示了只有一个任务时的进度监听方法,实际上,在开发中,一个任务中往往又有许多子任务,NSProgress是以树状的结构进行设计的,其支持子任务的嵌套,示例如下:
NSProgress的这种树状设计模式乍看起来确实有些令人费解,有一点需要注意,becomeCurrentWithPendingUnitCount:方法的意义是将此NSProgress对象注册为当前线程任务的根进度管理对象,resignCurrent方法为取消注册,这两个方法必须成对出现,当一个NSProgress对象被注册为当前线程的根节点时,后面使用类方法 progressWithTotalUnitCount:创建的NSProgress对象都默认作为子节点添加。
四、iOS9之后进行多任务进度监听的新设计方法
正如上面的例子所演示,注册根节点的方式可读性很差,代码结构也不太清晰,可能Apple的工程师们也觉得如此,在iOS9之后,NSProgress类中又添加了一些方法,通过这些方法可以更加清晰的表达进度指示器之间的层级结构,示例代码如下:
如上面代码所示,代码结构变得更加清晰,可操作性也更强了。
五、一点小总结
六、关于NSProgress对象的用户配置字典
在NSProgress对象的用户字典中可以设置一些特定的键值来进行显示模式的设置,示例如下:
七、在UI中显示进度步骤总结
以下有几个在视图或者视图控制器中显示进度的步骤:
1.在你调用一个长时间运行的任务之前,借助+progressWithTotalUnitCount:.方法建立一个NSProgress实例。 参数totalUnitCount将会包括“要完成的总工作单元的数量”。
有一点很重要,要从UI图层的角度完全理解这个数值;你不会被要求猜测有多少个实际工作对象以及有多少种类的工作单元(字节?像素?文字行数?)。如果你遍历集合并且计划为每一个集合元素调用该实例对象,该参数经常会是1或者也许是一个集合中的元素的数量 。
2.使用KVO注册一个进度的fractionCompleted属性的观察者。类似于NSOperation,NSProgress被设计借助KVO来使用。在MAC,这使得通过Cocoa Bindings绑定一个NSProgress实例到一个进度条或者标签上变得非常容易。在iOS上,你将会在KVO observer handle中手动更新你的UI。
除了fractionCompleted, completedUnitCount和totalUnitCount属性之外,NSProgress也有一个localizedDescription (@"50% completed"),并且还有一个localized Additional Description (@"3 of 6"),其能够被绑定到文本标签。KVO通知在改变NSProgress对象属性值的线程中发送,因此确保在你的主线程中手动更新UI。
3.当前的进度对象通过调用-becomeCurrentWithPendingUnitCount:方法建立新的进度对象。在这里,pendingUnitCount这个参数相当于“是要被接收者完成的总的工作单元的量要完成的工作的一部分”。你可以多次调用这个方法并且每次传递totalUnitCount(本次代码完成的占比)的一部分。在集合元素的迭代示例中,我们将会在每一次迭代中调用[progress becomeCurrentWithPendingUnitCount:1];
4.调用工作对象的方法。由于当前进度是一个局部线程概念,你必须在你调用becomeCurrentWithPendingUnitCount:的相同的线程中做这个事情。如果工作对象的API被设计成在主线程中调用,那这就不是一个问题,就像我对大部分API的看法那样(Brent Simmons 也这么认为)。
但是如果你的UI 层正在建立一个后台队列并且调用工作对象来同步那个队列,那要确保将 becomeCurrentWithPendingUnitCount:和resignCurrent放到相同的dispatch_async()块中调用。
5.在你的进度对象中调用-resignCurrent。这个方法是和-becomeCurrentWith PendingUnitCount:相对应的,并且会调用相同的次数 。你可以在实际工作被完成以前调用resignCurrent,因此你不需要等待,直到你得到一个来自工作对象的完成通知。
- iOS中使用NSProgress类来创建UI进度条的方法详解
- IOS NSProgress
- ios7中引入的新类:nsprogress介绍
- iOS进度管理NSProgress类简单实用实例
- 使用Swift开发IOS项目、UI创建、方法调用
- 使用Swift开发iOS项目、UI创建、方法调用
- iOS 贝塞尔曲线和CAShapeLayer 结合使用的进度条详解
- NSProgress
- NSProgress
- MFC创建UI线程并建立包含ProgressCtrl进度条对话框的简单方法
- ios开发中使用工厂模式创建ui控件(swift)
- iOS开发UI篇 -- 04011AppDelegate中方法详解2
- iOS开发UI篇 -- 04011AppDelegate中方法详解1
- iOS笔记UI--进度条
- 进度条的创建与使用
- iOS中UI控件的使用
- IOS中UI控件的基本使用
- iOS中使用@方法快速创建对象
- 自定义View
- 【解决】Junit单元测试中出现的报错
- Android开发-ImageViewDemo-AndroidStudio
- 将自己的应用程序编译进Android操作系统作为系统应用启动
- 目录处理命令
- iOS中使用NSProgress类来创建UI进度条的方法详解
- 二进制、八进制、十进制和十六进制之间的转换
- ImageView的android:scaleType属性和 src、Background之前的区别
- 通过jsp直接操作数据库
- 如何将mysql注册成服务
- Activity之方法汇总索引
- 将 Street View Text 数据集的 GroundTruth 标注在图像上
- XDC工具使用示例
- [Spring+Hibernate系列]1.Spring+Hibernate 框架搭建