多執行緒:barrier的使用
//
// ViewController.m
// 12-barrier使用
//
// Created by gzxzmac on 16/1/29.
// Copyright © 2016年 gzxzmac. All rights reserved.
//
#import "ViewController.h"
@interface ViewController () {
dispatch_queue_t _queue;
}
@property (nonatomic, strong) NSMutableArray *photoList; // 儲存下載好的圖片
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
[self download];
}
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
NSLog(@"下載了 %zd 張圖片",self.photoList.count);
}
// 最快速建立一個可變的陣列 @[].mutableCopy
- (NSMutableArray *)photoList {
if (_photoList == nil) {
_photoList = [NSMutableArray array];
}
return _photoList;
}
- (void)download {
// NSArray,字典,NSData,..... 執行緒安全
// 所有的可變的物件(字典,陣列,data) 非執行緒安全
/*
NSArchiver
NSAutoreleasePool
NSBundle
NSCalendar
NSCoder
NSCountedSet
NSDateFormatter
NSEnumerator
NSFileHandle
NSFormatter
NSHashTable functions
NSInvocation
NSJavaSetup functions
NSMapTable functions
NSMutableArray
NSMutableAttributedString
NSMutableCharacterSet
NSMutableData
NSMutableDictionary
NSMutableSet
NSMutableString
NSNotificationQueue
NSNumberFormatter
NSPipe
NSPort
NSProcessInfo
NSRunLoop
NSScanner
NSSerializer
NSTask
NSUnarchiver
NSUndoManager
*/
// 一定要使用自定義的併發佇列
_queue = dispatch_queue_create("itcast", DISPATCH_QUEUE_CONCURRENT);
for (int i = 0; i < 1000; ++i) {
dispatch_async(_queue, ^{
NSLog(@"下載圖片%d",i);
[NSThread sleepForTimeInterval:0.5];
// 模擬下載
NSString *imageName = [NSString stringWithFormat:@"%d.jpg",i % 9];
NSString *path = [[NSBundle mainBundle]pathForResource:imageName ofType:nil];
UIImage *image = [UIImage imageWithContentsOfFile:path];
// 使用barrier 之後,全部下載完之後,再統一儲存
// 減少多條執行緒搶奪資源的問題
// 在工作中基本不怎麼使用(知道)
dispatch_barrier_async(_queue, ^{
if (image == nil) {
NSLog(@"%d -- %@",i,path);
}
NSLog(@"儲存圖片%@",[NSThread currentThread]);
// 避免多個執行緒搶同一塊資源
[self.photoList addObject:image];
});
});
}
}
@end
相關文章
- Java多執行緒-執行緒池的使用Java執行緒
- java多執行緒之執行緒的基本使用Java執行緒
- 多執行緒-執行緒組的概述和使用執行緒
- 多執行緒-執行緒池的概述和使用執行緒
- 多執行緒使用執行緒
- iOS多執行緒的使用iOS執行緒
- 使用委託開啟多執行緒(多執行緒深入)執行緒
- Java多執行緒的使用(二)Java執行緒
- ArcGISEngine中的多執行緒使用執行緒
- iOS多執行緒全套:執行緒生命週期,多執行緒的四種解決方案,執行緒安全問題,GCD的使用,NSOperation的使用iOS執行緒GC
- MFC多執行緒的建立,包括工作執行緒和使用者介面執行緒執行緒
- 多執行緒程式設計基礎(一)-- 執行緒的使用執行緒程式設計
- 多執行緒的libcurl的使用執行緒
- 多執行緒:執行緒池理解和使用總結執行緒
- 執行緒以及多執行緒,多程式的選擇執行緒
- 多執行緒-多執行緒常見的面試題執行緒面試題
- 多執行緒【執行緒池】執行緒
- 多執行緒--執行緒管理執行緒
- Java多執行緒——執行緒Java執行緒
- IOS下使用多執行緒iOS執行緒
- VC多執行緒 C++ 多執行緒執行緒C++
- Java多執行緒——synchronized的使用示例Java執行緒synchronized
- 多執行緒-執行緒控制之休眠執行緒執行緒
- 多執行緒-執行緒控制之加入執行緒執行緒
- 多執行緒-執行緒控制之禮讓執行緒執行緒
- 多執行緒-執行緒控制之中斷執行緒執行緒
- 多執行緒(五)---執行緒的Yield方法執行緒
- 【Java多執行緒】執行緒安全的集合Java執行緒
- 多執行緒-程式和執行緒的概述執行緒
- 多執行緒程式設計基礎(二)-- 執行緒池的使用執行緒程式設計
- 執行緒和程式基礎以及多執行緒的基本使用(iOS)執行緒iOS
- java 多執行緒之使用 interrupt 停止執行緒的幾種方法Java執行緒
- 使用執行緒池優化多執行緒程式設計執行緒優化程式設計
- Swift多執行緒:使用Thread進行多執行緒間通訊,協調子執行緒任務Swift執行緒thread
- 多執行緒之初識執行緒執行緒
- Java多執行緒-執行緒中止Java執行緒
- Java多執行緒——執行緒池Java執行緒
- 多執行緒-執行緒概述等執行緒