iOS中如何實現遍歷-創新互聯

小編給大家分享一下iOS中如何實現遍歷,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

成都創新互聯是一家集網站建設,新林企業網站建設,新林品牌網站建設,網站定制,新林網站建設報價,網絡營銷,網絡優化,新林網站推廣為一體的創新建站企業,幫助傳統企業提升企業形象加強企業競爭力??沙浞譂M足這一群體相比中小企業更為豐富、高端、多元的互聯網需求。同時我們時刻保持專業、時尚、前沿,時刻以成就客戶成長自我,堅持不斷學習、思考、沉淀、凈化自己,讓我們為更多的企業打造出實用型網站。

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

經典for循環

NSArray *iosArray = @[@"a", @"b", @"c", @"d", @"e", @"f", @"g"];
for (int i = 0; i < iosArray.count; i++) {
  //處理數組中數據
  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) {
  //處理枚舉器中的數據
  NSLog(@"%@", object);
}

for-in快速遍歷

NSArray *iosArray = @[@"a", @"b", @"c", @"d", @"e", @"f", @"g"];
for (NSString *obj in iosArray) {
  //處理數組中的數據
  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還支持反向遍歷,并發遍歷,并發遍歷可以使用多核的優化,充分利用系統的資源。

反向遍歷

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;
  }
}];

并發遍歷

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循環,這里需要注意的是,dispatch_apple是同步調用,調用完畢返回結果,并且由于是GCD實現,所以可以使用并發隊列或者是串行隊列。代碼如下:

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循環中不要修改數組

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

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

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

遍歷的速率

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

遍歷實踐tips

數組分組

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

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不重復的特性,得到有多少組,根據數組中消息的月份屬性
}];
[set enumerateObjectsUsingBlock:^(id obj, BOOL *stop) {//遍歷set數組
  NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF.month = %@", obj];//創建謂詞篩選器
  NSArray *group = [tempDataArray filteredArrayUsingPredicate:predicate];//用數組的過濾方法得到新的數組,在添加的最終的數組
}

倒序遍歷

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

set排序

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

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

其實原理是將set轉化成array來實現的。

以上是“iOS中如何實現遍歷”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注創新互聯網站建設公司行業資訊頻道!

另外有需要云服務器可以了解下創新互聯建站m.kartarina.com,海內外云服務器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務器、裸金屬服務器、高防服務器、香港服務器、美國服務器、虛擬主機、免備案服務器”等云主機租用服務以及企業上云的綜合解決方案,具有“安全穩定、簡單易用、服務可用性高、性價比高”等特點與優勢,專為企業上云打造定制,能夠滿足用戶豐富、多元化的應用場景需求。

網站欄目:iOS中如何實現遍歷-創新互聯
網頁地址:http://m.kartarina.com/article24/dcpdje.html

成都網站建設公司_創新互聯,為您提供外貿建站、域名注冊、網站設計網站排名、網頁設計公司、微信公眾號

廣告

聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯

成都seo排名網站優化
主站蜘蛛池模板: 中文无码不卡的岛国片| 亚洲日韩一区二区一无码 | 免费看又黄又无码的网站| a级毛片无码免费真人久久| 亚洲精品无码99在线观看| 国产精品免费看久久久无码| 亚洲AⅤ永久无码精品AA| 亚洲国产精品无码久久一区二区| 一本加勒比HEZYO无码资源网| 亚洲AV永久无码精品| 国产精品无码AV天天爽播放器| 成人免费无码H在线观看不卡| 麻豆亚洲AV永久无码精品久久| 精品一区二区三区无码免费直播| 亚洲中文字幕无码一久久区| 无码毛片内射白浆视频| 无码人妻精品一区二区三区东京热 | 国产a级理论片无码老男人| 制服在线无码专区| 丰满熟妇人妻Av无码区| 人妻少妇乱子伦无码专区| 无码人妻精品中文字幕免费东京热| 精品国产AV无码一区二区三区| 日韩精品人妻系列无码专区免费| 成人免费无码大片A毛片抽搐色欲 成人免费无码大片a毛片 | 久久亚洲AV无码精品色午夜麻 | 亚洲免费日韩无码系列| 精品人妻系列无码人妻漫画| 亚洲AV日韩AV高潮无码专区| 黄桃AV无码免费一区二区三区| 亚洲精品GV天堂无码男同| 久久亚洲AV成人无码软件| 一本加勒比HEZYO无码人妻| 超清纯白嫩大学生无码网站| 无码国产亚洲日韩国精品视频一区二区三区 | 亚洲AV综合色区无码一区爱AV| 中文字幕av无码不卡免费| 亚洲日韩精品无码专区网站| 免费无码看av的网站| 亚洲AV无码专区亚洲AV桃| 亚洲欧洲av综合色无码|