欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

iOS中使用NSProgress類來創(chuàng)建UI進(jìn)度條的方法詳解

 更新時(shí)間:2016年06月17日 09:38:53   作者:琿少  
NSProgress是iOS7以后引入的用于制作進(jìn)度條的類,能夠監(jiān)聽多個(gè)任務(wù),這里就為大家?guī)韎OS中使用NSProgress類來創(chuàng)建UI進(jìn)度條的方法詳解,需要的朋友可以參考下

一、引言

在iOS7之前,系統(tǒng)一直沒有提供一個(gè)完整的框架來描述任務(wù)進(jìn)度相關(guān)的功能。這使得在開發(fā)中進(jìn)行耗時(shí)任務(wù)進(jìn)度的監(jiān)聽將什么麻煩,在iOS7之后,系統(tǒng)提供了NSProgress類來專門報(bào)告任務(wù)進(jìn)度。


二、創(chuàng)建單任務(wù)進(jìn)度監(jiān)聽器

單任務(wù)進(jìn)度的監(jiān)聽是NSProgress最簡單的一種運(yùn)用場景,我們來用定時(shí)器模擬一個(gè)耗時(shí)任務(wù),示例代碼如下:

@interface ViewController ()
{
 NSProgress * progress;
}
@end

@implementation ViewController

- (void)viewDidLoad {
 [super viewDidLoad];
 // Do any additional setup after loading the view, typically from a nib.
 //這個(gè)方法將創(chuàng)建任務(wù)進(jìn)度管理對(duì)象 UnitCount是一個(gè)基于UI上的完整任務(wù)的單元數(shù)
 progress = [NSProgress progressWithTotalUnitCount:10];
 NSTimer * timer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(task) userInfo:nil repeats:YES];
 //對(duì)任務(wù)進(jìn)度對(duì)象的完成比例進(jìn)行監(jiān)聽
 [progress addObserver:self forKeyPath:@"fractionCompleted" options:NSKeyValueObservingOptionNew context:nil];
}
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context

{
 NSLog(@"進(jìn)度= %f",progress.fractionCompleted);
}
-(void)task{
 //完成任務(wù)單元數(shù)+1
 
 if (progress.completedUnitCount<progress.totalUnitCount) {
  progress.completedUnitCount +=1;
 }
 
}

上面的示例代碼中,fractionCompleted屬性為0-1之間的浮點(diǎn)值,為任務(wù)的完成比例。NSProgress對(duì)象中還有兩個(gè)字符串類型的屬性,這兩個(gè)屬性將進(jìn)度信息轉(zhuǎn)化成固定的格式:

//顯示完后比例 如:10% completed
@property (null_resettable, copy) NSString *localizedDescription;
//完成數(shù)量 如:1 of 10
@property (null_resettable, copy) NSString *localizedAdditionalDescription;

三、創(chuàng)建多任務(wù)進(jìn)度監(jiān)聽器

上面演示了只有一個(gè)任務(wù)時(shí)的進(jìn)度監(jiān)聽方法,實(shí)際上,在開發(fā)中,一個(gè)任務(wù)中往往又有許多子任務(wù),NSProgress是以樹狀的結(jié)構(gòu)進(jìn)行設(shè)計(jì)的,其支持子任務(wù)的嵌套,示例如下:

- (void)viewDidLoad {
 [super viewDidLoad];
 // Do any additional setup after loading the view, typically from a nib.
 //這個(gè)方法將創(chuàng)建任務(wù)進(jìn)度管理對(duì)象 UnitCount是一個(gè)基于UI上的完整任務(wù)的單元數(shù)
 progress = [NSProgress progressWithTotalUnitCount:10];
 //對(duì)任務(wù)進(jìn)度對(duì)象的完成比例進(jìn)行監(jiān)聽
 [progress addObserver:self forKeyPath:@"fractionCompleted" options:NSKeyValueObservingOptionNew context:nil];
 //向下分支出一個(gè)子任務(wù) 子任務(wù)進(jìn)度總數(shù)為5個(gè)單元 即當(dāng)子任務(wù)完成時(shí) 父progerss對(duì)象進(jìn)度走5個(gè)單元
 [progress becomeCurrentWithPendingUnitCount:5];
 [self subTaskOne];
 [progress resignCurrent];
 //向下分出第2個(gè)子任務(wù)
 [progress becomeCurrentWithPendingUnitCount:5];
 [self subTaskOne];
 [progress resignCurrent];
}

-(void)subTaskOne{
 //子任務(wù)總共有10個(gè)單元
 NSProgress * sub =[NSProgress progressWithTotalUnitCount:10];
 int i=0;
 while (i<10) {
  i++;
  sub.completedUnitCount++;
 }
}

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context

{
 NSLog(@"= %@",progress.localizedAdditionalDescription);
}

NSProgress的這種樹狀設(shè)計(jì)模式乍看起來確實(shí)有些令人費(fèi)解,有一點(diǎn)需要注意,becomeCurrentWithPendingUnitCount:方法的意義是將此NSProgress對(duì)象注冊(cè)為當(dāng)前線程任務(wù)的根進(jìn)度管理對(duì)象,resignCurrent方法為取消注冊(cè),這兩個(gè)方法必須成對(duì)出現(xiàn),當(dāng)一個(gè)NSProgress對(duì)象被注冊(cè)為當(dāng)前線程的根節(jié)點(diǎn)時(shí),后面使用類方法 progressWithTotalUnitCount:創(chuàng)建的NSProgress對(duì)象都默認(rèn)作為子節(jié)點(diǎn)添加。

四、iOS9之后進(jìn)行多任務(wù)進(jìn)度監(jiān)聽的新設(shè)計(jì)方法

        正如上面的例子所演示,注冊(cè)根節(jié)點(diǎn)的方式可讀性很差,代碼結(jié)構(gòu)也不太清晰,可能Apple的工程師們也覺得如此,在iOS9之后,NSProgress類中又添加了一些方法,通過這些方法可以更加清晰的表達(dá)進(jìn)度指示器之間的層級(jí)結(jié)構(gòu),示例代碼如下:

- (void)viewDidLoad {
 [super viewDidLoad];
 // Do any additional setup after loading the view, typically from a nib.
 //這個(gè)方法將創(chuàng)建任務(wù)進(jìn)度管理對(duì)象 UnitCount是一個(gè)基于UI上的完整任務(wù)的單元數(shù)
 progress = [NSProgress progressWithTotalUnitCount:10];
 //對(duì)任務(wù)進(jìn)度對(duì)象的完成比例進(jìn)行監(jiān)聽
 [progress addObserver:self forKeyPath:@"fractionCompleted" options:NSKeyValueObservingOptionNew context:nil];
 //創(chuàng)建子節(jié)點(diǎn)
 NSProgress * sub = [NSProgress progressWithTotalUnitCount:10 parent:progress pendingUnitCount:5];
 NSProgress * sub2 = [NSProgress progressWithTotalUnitCount:10 parent:progress pendingUnitCount:5];
 for (int i=0; i<10; i++) {
  sub.completedUnitCount ++;
  sub2.completedUnitCount ++;
 }
}

如上面代碼所示,代碼結(jié)構(gòu)變得更加清晰,可操作性也更強(qiáng)了。

五、一點(diǎn)小總結(jié)

//獲取當(dāng)前線程的進(jìn)度管理對(duì)象根節(jié)點(diǎn)
//注意:當(dāng)有NSProgress對(duì)象調(diào)用了becomeCurrentWithPendingUnitCount:方法后,這個(gè)方法才能獲取到
+ (nullable NSProgress *)currentProgress;
//創(chuàng)建一個(gè)NSProgress對(duì)象,需要傳入進(jìn)度的單元數(shù)量
+ (NSProgress *)progressWithTotalUnitCount:(int64_t)unitCount;
//和上一個(gè)方法功能相似 iOS9之后的新方法
+ (NSProgress *)discreteProgressWithTotalUnitCount:(int64_t)unitCount;
//iOS9之后的新方法 創(chuàng)建某個(gè)進(jìn)度指示器節(jié)點(diǎn)的子節(jié)點(diǎn)
+ (NSProgress *)progressWithTotalUnitCount:(int64_t)unitCount parent:(NSProgress *)parent pendingUnitCount:(int64_t)portionOfParentTotalUnitCount;
//NSProgress實(shí)例的初始化方法 自父節(jié)點(diǎn)參數(shù)可以為nil
- (instancetype)initWithParent:(nullable NSProgress *)parentProgressOrNil userInfo:(nullable NSDictionary *)userInfoOrNil;
//注冊(cè)為當(dāng)前線程根節(jié)點(diǎn)
- (void)becomeCurrentWithPendingUnitCount:(int64_t)unitCount;
//取消注冊(cè) 與注冊(cè)方法必須同步出現(xiàn)
- (void)resignCurrent;
//iOS9新方法 向一個(gè)節(jié)點(diǎn)中添加一個(gè)子節(jié)點(diǎn)
- (void)addChild:(NSProgress *)child withPendingUnitCount:(int64_t)inUnitCount;
//進(jìn)度單元總數(shù)
@property int64_t totalUnitCount;
//已完成的進(jìn)度單元數(shù)
@property int64_t completedUnitCount;
//是否可取消
@property (getter=isCancellable) BOOL cancellable;
//是否可暫停
@property (getter=isPausable) BOOL pausable;
//進(jìn)度比例 0-1之間
@property (readonly) double fractionCompleted;
//取消
- (void)cancel;
//暫停
- (void)pause;
//恢復(fù)
- (void)resume

六、關(guān)于NSProgress對(duì)象的用戶配置字典

在NSProgress對(duì)象的用戶字典中可以設(shè)置一些特定的鍵值來進(jìn)行顯示模式的設(shè)置,示例如下:

//設(shè)置剩余時(shí)間 會(huì)影響localizedAdditionalDescription的值
/*
例如:0 of 10 — About 10 seconds remaining
*/
[progress setUserInfoObject:@10 forKey:NSProgressEstimatedTimeRemainingKey];
//設(shè)置完成速度信息 會(huì)影響localizedAdditionalDescription的值
/*
例如:Zero KB of 10 bytes (15 bytes/sec)
*/
[progress setUserInfoObject:@15 forKey:NSProgressThroughputKey];
/*
下面這些鍵值的生效 必須將NSProgress對(duì)象的kind屬性設(shè)置為 NSProgressKindFile
NSProgressFileOperationKindKey鍵對(duì)應(yīng)的是提示文字類型 會(huì)影響localizedDescription的值
NSProgressFileOperationKindKey可選的對(duì)應(yīng)值如下:
NSProgressFileOperationKindDownloading: 顯示Downloading files…
NSProgressFileOperationKindDecompressingAfterDownloading: 顯示Decompressing files…
NSProgressFileOperationKindReceiving: 顯示Receiving files…
NSProgressFileOperationKindCopying: 顯示Copying files…
*/
 [progress setUserInfoObject:NSProgressFileOperationKindDownloading forKey:NSProgressFileOperationKindKey];
/*
NSProgressFileTotalCountKey鍵設(shè)置顯示的文件總數(shù) 
例如:Copying 100 files…
*/
 [progress setUserInfoObject:@100 forKey:NSProgressFileTotalCountKey];
//設(shè)置已完成的數(shù)量
[progress setUserInfoObject:@1 forKey:NSProgressFileCompletedCountKey];

七、在UI中顯示進(jìn)度步驟總結(jié)
以下有幾個(gè)在視圖或者視圖控制器中顯示進(jìn)度的步驟:
1.在你調(diào)用一個(gè)長時(shí)間運(yùn)行的任務(wù)之前,借助+progressWithTotalUnitCount:.方法建立一個(gè)NSProgress實(shí)例。 參數(shù)totalUnitCount將會(huì)包括“要完成的總工作單元的數(shù)量”。
 
有一點(diǎn)很重要,要從UI圖層的角度完全理解這個(gè)數(shù)值;你不會(huì)被要求猜測有多少個(gè)實(shí)際工作對(duì)象以及有多少種類的工作單元(字節(jié)?像素?文字行數(shù)?)。如果你遍歷集合并且計(jì)劃為每一個(gè)集合元素調(diào)用該實(shí)例對(duì)象,該參數(shù)經(jīng)常會(huì)是1或者也許是一個(gè)集合中的元素的數(shù)量 。
 
2.使用KVO注冊(cè)一個(gè)進(jìn)度的fractionCompleted屬性的觀察者。類似于NSOperation,NSProgress被設(shè)計(jì)借助KVO來使用。在MAC,這使得通過Cocoa Bindings綁定一個(gè)NSProgress實(shí)例到一個(gè)進(jìn)度條或者標(biāo)簽上變得非常容易。在iOS上,你將會(huì)在KVO observer handle中手動(dòng)更新你的UI。
 
除了fractionCompleted, completedUnitCount和totalUnitCount屬性之外,NSProgress也有一個(gè)localizedDescription (@"50% completed"),并且還有一個(gè)localized Additional Description (@"3 of 6"),其能夠被綁定到文本標(biāo)簽。KVO通知在改變NSProgress對(duì)象屬性值的線程中發(fā)送,因此確保在你的主線程中手動(dòng)更新UI。
 
3.當(dāng)前的進(jìn)度對(duì)象通過調(diào)用-becomeCurrentWithPendingUnitCount:方法建立新的進(jìn)度對(duì)象。在這里,pendingUnitCount這個(gè)參數(shù)相當(dāng)于“是要被接收者完成的總的工作單元的量要完成的工作的一部分”。你可以多次調(diào)用這個(gè)方法并且每次傳遞totalUnitCount(本次代碼完成的占比)的一部分。在集合元素的迭代示例中,我們將會(huì)在每一次迭代中調(diào)用[progress becomeCurrentWithPendingUnitCount:1];
 
4.調(diào)用工作對(duì)象的方法。由于當(dāng)前進(jìn)度是一個(gè)局部線程概念,你必須在你調(diào)用becomeCurrentWithPendingUnitCount:的相同的線程中做這個(gè)事情。如果工作對(duì)象的API被設(shè)計(jì)成在主線程中調(diào)用,那這就不是一個(gè)問題,就像我對(duì)大部分API的看法那樣(Brent Simmons 也這么認(rèn)為)。
 
但是如果你的UI 層正在建立一個(gè)后臺(tái)隊(duì)列并且調(diào)用工作對(duì)象來同步那個(gè)隊(duì)列,那要確保將 becomeCurrentWithPendingUnitCount:和resignCurrent放到相同的dispatch_async()塊中調(diào)用。
 
5.在你的進(jìn)度對(duì)象中調(diào)用-resignCurrent。這個(gè)方法是和-becomeCurrentWith PendingUnitCount:相對(duì)應(yīng)的,并且會(huì)調(diào)用相同的次數(shù) 。你可以在實(shí)際工作被完成以前調(diào)用resignCurrent,因此你不需要等待,直到你得到一個(gè)來自工作對(duì)象的完成通知。

相關(guān)文章

  • IOS入門筆記之地理位置定位系統(tǒng)

    IOS入門筆記之地理位置定位系統(tǒng)

    關(guān)于地理位置及定位系統(tǒng),在iOS開發(fā)中也比較常見,接下來通過本文給大家介紹IOS入門筆記之地理位置定位系統(tǒng),對(duì)ios地理位置定位系統(tǒng)感興趣的朋友一起學(xué)習(xí)吧
    2016-01-01
  • iOS中屏幕亮度與閃光燈控制詳解

    iOS中屏幕亮度與閃光燈控制詳解

    這篇文章主要給大家介紹了關(guān)于iOS中屏幕亮度與閃光燈控制的相關(guān)資料,文中介紹的非常詳細(xì),對(duì)大家具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起看看吧。
    2017-06-06
  • iOS UITableView 拖動(dòng)排序?qū)崿F(xiàn)代碼

    iOS UITableView 拖動(dòng)排序?qū)崿F(xiàn)代碼

    這篇文章主要為大家詳細(xì)介紹了iOS UITableView 拖動(dòng)排序?qū)崿F(xiàn)代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-09-09
  • iOS開發(fā)之枚舉用法小結(jié)

    iOS開發(fā)之枚舉用法小結(jié)

    大家都知道枚舉是C語言中的一種基本數(shù)據(jù)類型,是一個(gè)"被命名的整型常量"的集合,它不參與內(nèi)存的占用和釋放,我們?cè)陂_發(fā)中使用枚舉的目的只有一個(gè),那就是為了增加代碼的可讀性。下面就來來看看在iOS中枚舉的用法,有需要的朋友們可以看看。
    2016-09-09
  • iOS-Mac遠(yuǎn)程連接控制Window

    iOS-Mac遠(yuǎn)程連接控制Window

    這篇文章主要為大家詳細(xì)介紹了iOS-Mac遠(yuǎn)程連接控制Window,蘋果電腦遠(yuǎn)程連接控制Windows電腦,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-11-11
  • iOS開發(fā)網(wǎng)絡(luò)篇—實(shí)現(xiàn)大文件的多線程斷點(diǎn)下載

    iOS開發(fā)網(wǎng)絡(luò)篇—實(shí)現(xiàn)大文件的多線程斷點(diǎn)下載

    iOS開發(fā)中經(jīng)常會(huì)用到文件的下載功能,這篇文章主要介紹了iOS開發(fā)網(wǎng)絡(luò)篇—實(shí)現(xiàn)大文件的多線程斷點(diǎn)下載,今天咱們來分享一下思路。
    2016-11-11
  • IOS 通過tag刪除動(dòng)態(tài)創(chuàng)建的UIButton

    IOS 通過tag刪除動(dòng)態(tài)創(chuàng)建的UIButton

    這篇文章主要介紹了IOS 通過tag刪除動(dòng)態(tài)創(chuàng)建的UIButton的相關(guān)資料,需要的朋友可以參考下
    2017-03-03
  • 解決ios audio無法播放問題

    解決ios audio無法播放問題

    這篇文章主要介紹了解決ios audio無法播放問題,并給大家分享了解決方法,需要的朋友參考一下。
    2017-11-11
  • Flutter開發(fā)Widgets?之?PageView使用示例

    Flutter開發(fā)Widgets?之?PageView使用示例

    這篇文章主要為大家介紹了Flutter開發(fā)Widgets?之?PageView使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-10-10
  • 詳解ios中scrollView上使用masonry

    詳解ios中scrollView上使用masonry

    本篇文章主要給大家詳細(xì)分析了ios開發(fā)中scrollView上使用masonry的詳細(xì)知識(shí)內(nèi)容,需要的朋友參考下吧。
    2018-02-02

最新評(píng)論