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

iOS中遍歷的方法總結

 更新時間:2017年04月27日 10:23:40   作者:Hyyy''s blog  
本篇文章主要介紹了iOS中遍歷的方法總結,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

在iOS開發(fā)中,可以使用多種方法進行元素遍歷,具體有一下幾種:

經(jīng)典for循環(huán)

NSArray *iosArray = @[@"a", @"b", @"c", @"d", @"e", @"f", @"g"];
for (int i = 0; i < iosArray.count; i++) {
  //處理數(shù)組中數(shù)據(jù)
  NSLog(@"%@", iosArray[i]);
}

NSEnumerator遍歷

NSArray *iosArray = @[@"a", @"b", @"c", @"d", @"e", @"f", @"g"];
NSEnumerator *enumerator = [iosArray objectEnumerator];//正向遍歷
// NSEnumerator *enumerator = [iosArray reverseObjectEnumerator];//反向遍歷

id object;

while ((object = [enumerator nextObject]) != nil) {
  //處理枚舉器中的數(shù)據(jù)
  NSLog(@"%@", object);
}

for-in快速遍歷

NSArray *iosArray = @[@"a", @"b", @"c", @"d", @"e", @"f", @"g"];
for (NSString *obj in iosArray) {
  //處理數(shù)組中的數(shù)據(jù)
  NSLog(@"%@", obj);
}

EnumeratorBlock遍歷

NSArray *iosArray = @[@"a", @"b", @"c", @"d", @"e", @"f", @"g"];
[iosArray enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
  NSLog(@"%@", obj);
  if ([obj isEqualToString:@"e"]) {
    *stop = YES;  // 跳出遍歷
  }
}];

另外,EnumeratorBlock還支持反向遍歷,并發(fā)遍歷,并發(fā)遍歷可以使用多核的優(yōu)化,充分利用系統(tǒng)的資源。

反向遍歷

NSArray *iosArray = @[@"a", @"b", @"c", @"d", @"e", @"f", @"g"];
[iosArray enumerateObjectsWithOptions:NSEnumerationReverse usingBlock:^(NSString *obj, NSUInteger idx, BOOL * _Nonnull stop) {
  NSLog(@"%@", obj);
  if ([obj isEqualToString:@"e"]) {
    *stop = YES;
  }
}];

并發(fā)遍歷

NSArray *iosArray = @[@"a", @"b", @"c", @"d", @"e", @"f", @"g"];
NSMutableArray *iosMutableArray = [NSMutableArray arrayWithArray:iosArray];
[iosMutableArray enumerateObjectsWithOptions:NSEnumerationConcurrent usingBlock:^(NSString *obj, NSUInteger idx, BOOL * _Nonnull stop) {
  obj = [NSString stringWithFormat:@"_%@", obj];
  [iosMutableArray replaceObjectAtIndex:idx withObject:obj];
  NSLog(@"%@", obj);

  if ([obj isEqualToString:@"_I"]) {
    *stop = YES;
  }
}];

dispatch_apply遍歷

dispatch_apply類似于for循環(huán),這里需要注意的是,dispatch_apple是同步調用,調用完畢返回結果,并且由于是GCD實現(xiàn),所以可以使用并發(fā)隊列或者是串行隊列。代碼如下:

dispatch_queue_t queue = dispatch_queue_create("queue", DISPATCH_QUEUE_CONCURRENT);
//  dispatch_queue_t queue = dispatch_queue_create("queue", DISPATCH_QUEUE_SERIAL); // 串行隊列
dispatch_apply(array.count, queue, ^(size_t i) {
  Enumerate *enumerate = [array objectAtIndex:i];
  NSLog(@"number: %ld", enumerate.number);
});

遍歷的注意事項

for循環(huán)中不要修改數(shù)組

遍歷過程中是不能隨便刪除遍歷的元素的,如果需要刪除元素,可以先復制一份出來,比如如下的代碼會有問題:

NSMutableArray *iosArray = @[@"a", @"b", @"c", @"d", @"e", @"f", @"g"];
for (NSString *obj in iosArray) {
  //處理數(shù)組中的數(shù)據(jù)
  if([@"e" isEqualTo:obj]) {
    [iosArray removeObject:obj];
  }
}

但是使用enumerateBlock可以在block內部做removeObject操作,原因應該是和Block的特性有關, 在Block中會保存變量的值,而不會隨變量的值的改變而改變 。

遍歷的速率

當數(shù)組容量很大的時候,如果只是進行數(shù)組遍歷的話,使用for-in是最快速的,其次是并發(fā)遍歷,這個很多人都以為enumerateBlock是最快的。

遍歷實踐tips

數(shù)組分組

在開發(fā)中,有時需要對數(shù)組進行某種情況的分組,比如,一個擁有很多消息模型的數(shù)組,我們需要根據(jù)消息的創(chuàng)建月份進行分組,那么可以使用下面的方法實現(xiàn):

NSMutableSet *set=[NSMutableSet set];
NSArray *array = @[message1, message2, message3, message4, message5, message6, message7];
__block NSArray *tempDataArray = [NSArray arrayWithArray:array];
[tempDataArray enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
  [set addObject:obj.month];//利用set不重復的特性,得到有多少組,根據(jù)數(shù)組中消息的月份屬性
}];
[set enumerateObjectsUsingBlock:^(id obj, BOOL *stop) {//遍歷set數(shù)組
  NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF.month = %@", obj];//創(chuàng)建謂詞篩選器
  NSArray *group = [tempDataArray filteredArrayUsingPredicate:predicate];//用數(shù)組的過濾方法得到新的數(shù)組,在添加的最終的數(shù)組
}

倒序遍歷

倒序遍歷也很常見,可以使用上面的反向遍歷來實現(xiàn)。

set排序

這個和Emunerate其實沒有關系,但是也很實用,我們知道set是無序的,但是有時需要實現(xiàn)有順序的set,可以使用下面來實現(xiàn):

//由于set無序,現(xiàn)將set轉換成nsarray
NSArray *sortDescriptor = @[[[NSSortDescriptor alloc] initWithKey:@"self" ascending:NO]];
NSArray *sortSetArray = [set sortedArrayUsingDescriptors:sortDescriptor];

其實原理是將set轉化成array來實現(xiàn)的。

總結

遍歷在我們日常開發(fā)中十分常見,根據(jù)應用場景,選擇合適的遍歷方法才是我們需要關系的。這篇文章總結了下遍歷的種類和注意事項,希望能幫助到有需要的同學。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • 基于UIControl控件實現(xiàn)ios點贊功能

    基于UIControl控件實現(xiàn)ios點贊功能

    在開發(fā)當中,可能很多時候都需要做個點贊的需求,如果用按鈕實現(xiàn),按鈕作為一個系統(tǒng)復合控件,外部是一個 View--》UIControl的容器,本文給大家分享一個基于UIControl控件實現(xiàn)ios點贊功能,需要的朋友可以參考下
    2015-09-09
  • iOS開發(fā)之手勢gesture詳解

    iOS開發(fā)之手勢gesture詳解

    本篇文章介紹了iOS開發(fā)之手勢gesture,現(xiàn)在分享給大家,具有一定的參考價值,感興趣的小伙伴們可以參考一下。
    2016-11-11
  • 詳細整理iOS中UITableView的性能優(yōu)化

    詳細整理iOS中UITableView的性能優(yōu)化

    最近在微博上看到一個很好的開源項目,是關于如何優(yōu)化UITableView的,加上正好最近也在優(yōu)化項目中的類似朋友圈功能這塊,思考了很多關于UITableView的優(yōu)化技巧,所以決定詳細的整理下對優(yōu)化UITableView的理解,需要的朋友們可以參考借鑒。
    2017-03-03
  • 一個iOS上的秒表小應用的實現(xiàn)方法分享

    一個iOS上的秒表小應用的實現(xiàn)方法分享

    這篇文章主要介紹了一個iOS上的秒表小應用的實現(xiàn)方法分享,代碼基于傳統(tǒng)的Objective-C,需要的朋友可以參考下
    2015-10-10
  • iOS UIAlertController中UITextField添加晃動效果與邊框顏色詳解

    iOS UIAlertController中UITextField添加晃動效果與邊框顏色詳解

    這篇文章主要給大家介紹了關于iOS UIAlertController中UITextField添加晃動效果與邊框顏色的相關資料,實現(xiàn)后的效果非常適合在開發(fā)中使用,文中給出了詳細的示例代碼,需要的朋友可以參考借鑒,下面隨著小編來一起看看吧。
    2017-10-10
  • IOS 聊天界面(自適應文字)的實現(xiàn)

    IOS 聊天界面(自適應文字)的實現(xiàn)

    本文主要介紹一個實現(xiàn)聊天界面的思路過程,具有很好的參考價值。下面跟著小編一起來看下吧
    2017-03-03
  • 查看iOS Crash logs的方法

    查看iOS Crash logs的方法

    發(fā)布了一個應用,用戶使用 的時候crash了,現(xiàn)在想調查為何crash,所以想在這里探討一下如何查看iphone 手機的crash logs
    2015-06-06
  • iOS安全防護系列之字符串及系統(tǒng)函數(shù)隱藏詳解

    iOS安全防護系列之字符串及系統(tǒng)函數(shù)隱藏詳解

    這篇文章主要給大家介紹了關于iOS安全防護系列之字符串及系統(tǒng)函數(shù)隱藏的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2018-07-07
  • iOS中UIScrollerView的用法及基于AotoLayout的控件懸停

    iOS中UIScrollerView的用法及基于AotoLayout的控件懸停

    這篇文章主要介紹了iOS中UIScrollerView的用法及基于AotoLayout的控件懸停,文中對于UIScrollerView的方法及屬性介紹地非常詳細,十分推薦,示例代碼為Objective-C,需要的朋友可以參考下
    2016-03-03
  • 零基礎學習iOS直播之播放

    零基礎學習iOS直播之播放

    對于直播來說,客戶端主要做兩件事情,推流和播放。本篇主要對播放進行詳細介紹,需要的朋友一起來看下吧
    2016-12-12

最新評論