国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

iOS多線程總結

2019-11-14 19:18:46
字體:
來源:轉載
供稿:網友
1.不要同時開太多的線程(1~3條線程即可,不要超過5條)
2.線程概念
1> 主線程 : UI線程,顯示、刷新UI界面,處理UI控件的事件
2> 子線程 : 后臺線程,異步線程
3.不要把耗時的操作放在主線程,要放在子線程中執行
 
一、NSThread(掌握)
1.創建和啟動線程的3種方式
1> 先創建,后啟動
// 創建NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(download:) object:nil]; // 啟動[thread start];

 

 
2> 創建完自動啟動
[NSThread detachNewThreadSelector:@selector(download:) toTarget:self withObject:nil];

 

 
3> 隱式創建(自動啟動)
[self performSelectorInBackground:@selector(download:) withObject:nil];

 

 
2.常見方法
1> 獲得當前線程
+ (NSThread *)currentThread;

 

 
2> 獲得主線程
+ (NSThread *)mainThread;

 

 
3> 睡眠(暫停)線程
+ (void)sleepUntilDate:(NSDate *)date;+ (void)sleepForTimeInterval:(NSTimeInterval)ti;

 

 
4> 設置線程的名字
- (void)setName:(NSString *)n;- (NSString *)name;

 

 
二、線程同步(掌握)
1.實質:為了防止多個線程搶奪同一個資源造成的數據安全問題
 
2.實現:給代碼加一個互斥鎖(同步鎖)
@synchronized(self) {// 被鎖住的代碼}

 

 
三、GCD
1.隊列和任務
1> 任務 :需要執行什么操作
* 用block來封裝任務
 
2> 隊列 :存放任務
* 全局的并發隊列 : 可以讓任務并發執行 DISPATCH_QUEUE_PRIORITY_DEFAULT優先級
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

 

 
* 自己創建的串行隊列 : 讓任務一個接著一個執行
dispatch_queue_t queue = dispatch_queue_create("cn.heima.queue_name", NULL);

 

 
* 主隊列 : 讓任務在主線程執行
dispatch_queue_t queue = dispatch_get_main_queue();

 

 
2.執行任務的函數
1> 同步執行 : 不具備開啟新線程的能力
dispatch_sync...
 
2> 異步執行 : 具備開啟新線程的能力
dispatch_async...
 
3.常見的組合(掌握)
1> dispatch_async + 全局并發隊列
2> dispatch_async + 自己創建的串行隊列
 
4.線程間的通信(掌握)
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{// 執行耗時的異步操作...  dispatch_async(dispatch_get_main_queue(), ^{// 回到主線程,執行UI刷新操作});});

 

 
5.GCD的所有API都在libdispatch.dylib,Xcode會自動導入這個庫
* 主頭文件 : #import <dispatch/dispatch.h>
 
6.延遲執行(掌握)
1> perform....
// 3秒后自動回到當前線程調用self的download:方法,并且傳遞參數:@"http://xxx.jpg"
[self performSelector:@selector(download:) withObject:@"http://xxx.jpg" afterDelay:3];

 

2> dispatch_after...
// 任務放到哪個隊列中執行dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);double delay = 3; // 延遲多少秒dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delay * NSEC_PER_SEC)), queue, ^{// 3秒后需要執行的任務});

 

 
7.一次性代碼(掌握)
static dispatch_once_t onceToken;dispatch_once(&onceToken, ^{// 這里面的代碼,在程序運行過程中,永遠只會執行1次});

 

 
四、單例模式(懶漢式)
1.ARC
@interface HMDataTool : NSObject+ (instancetype)sharedDataTool;@end @implementation HMDataTool// 用來保存唯一的單例對象static id _instace; + (id)allocWithZone:(struct _NSZone *)zone{static dispatch_once_t onceToken;dispatch_once(&onceToken, ^{_instace = [super allocWithZone:zone];});return _instace;} + (instancetype)sharedDataTool{static dispatch_once_t onceToken;dispatch_once(&onceToken, ^{_instace = [[self alloc] init];});return _instace;} - (id)copyWithZone:(NSZone *)zone{return _instace;}@end

 

 
2.非ARC
@interface HMDataTool : NSObject+ (instancetype)sharedDataTool;@end @implementation HMDataTool// 用來保存唯一的單例對象static id _instace; + (id)allocWithZone:(struct _NSZone *)zone{static dispatch_once_t onceToken;dispatch_once(&onceToken, ^{_instace = [super allocWithZone:zone];});return _instace;} + (instancetype)sharedDataTool{static dispatch_once_t onceToken;dispatch_once(&onceToken, ^{_instace = [[self alloc] init];});return _instace;} - (id)copyWithZone:(NSZone *)zone{return _instace;} - (oneway void)release { } - (id)retain {return self;} - (NSUInteger)retainCount {return 1;} - (id)autorelease {return self;}@end

 

 
五、NSOperation和NSOperationQueue
1.隊列的類型
1> 主隊列
[NSOperationQueue mainQueue];

* 添加到"主隊列"中的操作,都會放到主線程中執行

 
2> 非主隊列
[[NSOperationQueue alloc] init]

* 添加到"非主隊列"中的操作,都會放到子線程中執行

 
2.隊列添加任務
- (void)addOperation:(NSOperation *)op;- (void)addOperationWithBlock:(void (^)(void))block;

 

 
3.常見用法
1> 設置最大并發數
- (NSInteger)maxConcurrentOperationCount;- (void)setMaxConcurrentOperationCount:(NSInteger)cnt;

 

2> 隊列的其他操作
* 取消所有的操作
- (void)cancelAllOperations;

 

* 暫停所有的操作
[queue setSuspended:YES];

 

* 恢復所有的操作
[queue setSuspended:NO];

 

4.操作之間的依賴(面試題)
* NSOperation之間可以設置依賴來保證執行順序
 
[operationB addDependency:operationA];

 

// 操作B依賴于操作A,等操作A執行完畢后,才會執行操作B
* 注意:不能相互依賴,比如A依賴B,B依賴A
* 可以在不同queue的NSOperation之間創建依賴關系
 
5.線程之間的通信
NSOperationQueue *queue = [[NSOperationQueue alloc] init];[queue addOperationWithBlock:^{}];

 

// 1.執行一些比較耗時的操作
 
// 2.回到主線程
 [[NSOperationQueue mainQueue] addOperationWithBlock:^{     }]; }];

 

六、從其他線程回到主線程的方式
1.perform...
1 [self performSelectorOnMainThread:<#(SEL)#> withObject:<#(id)#> waitUntilDone:<#(BOOL)#>];

 

 
2.GCD
dispatch_async(dispatch_get_main_queue(), ^{ });

 

 
3.NSOperationQueue
[[NSOperationQueue mainQueue] addOperationWithBlock:^{ }];

 

 

額外需注意在使用GCD同步的時候不要和主隊列一起使用,否則會出現問題,例如下圖這樣的用法是錯誤的

 


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 绥江县| 成安县| 开鲁县| 无棣县| 积石山| 乡城县| 香港| 兰考县| 如东县| 延长县| 无锡市| 金乡县| 吴江市| 平定县| 襄汾县| 嘉峪关市| 黔东| 博白县| 三门县| 长子县| 望江县| 砚山县| 嘉定区| 栾川县| 通许县| 长寿区| 呼玛县| 凤翔县| 民权县| 富源县| 甘谷县| 姚安县| 正安县| 琼海市| 濮阳县| 丹凤县| 历史| 洞头县| 富平县| 策勒县| 盐池县|