線程

什么時候使用多線程編程:執(zhí)行繁重任務時,為了避免卡主線程操作,可以使用多線程編程方式來開辟分線程操作,執(zhí)行任務。

IOS多線程操作方式分類

1.NSThread 輕量級的多線程編程方式 操作方便 功能單一

//第一種
[NSThread detachNewThreadSelector:@selector(one) toTarget:self withObject:nil];
//第二種
NSThread *thread = [[NSThread alloc]initWithTarget:self selector:@selector(one) object:nil];
[thread start];
//第三種
[self performSelectorInBackground:@selector(one) withObject:nil];

//開辟一個分線程
-(void)one
{
    [NSThread isMainThread]?NSLog(@"主線程1"):NSLog(@"分線程1");

    //回到主線程中
    [self performSelectorOnMainThread:@selector(two) withObject:nil waitUntilDone:YES];
}
//回到主線程執(zhí)行刷新UI
-(void)two
{
    imgView.image = ...;
}

NSBlockOperation 并行線程操作 不會主動創(chuàng)建分線程 而是根據(jù)當前線程是否空閑 如果有就是用空閑線程 如果沒有就開辟分線程

//NSBlockOperation
//并行的線程操作 不會主動創(chuàng)建分線程 而是根據(jù)當前線程是否有空閑 如果有就使用空閑線程 如果沒有就開辟分線程
NSBlockOperation *operation1 = [NSBlockOperation blockOperationWithBlock:^{
    [NSThread isMainThread]?NSLog(@"主線程1"):NSLog(@"分線程1");
}];
[operation1 addExecutionBlock:^{
    [NSThread isMainThread]?NSLog(@"主線程2"):NSLog(@"分線程2");
}];
[operation1 addExecutionBlock:^{
    [NSThread isMainThread]?NSLog(@"主線程3"):NSLog(@"分線程3");
}];
[operation1 addExecutionBlock:^{
    [NSThread isMainThread]?NSLog(@"主線程4"):NSLog(@"分線程4");
}];
[operation1 addExecutionBlock:^{
    [NSThread isMainThread]?NSLog(@"主線程5"):NSLog(@"分線程5");
}];
[operation1 start];

NSInvocationOperation 只有在分線程中創(chuàng)建它的方法才是在分線程中執(zhí)行的

//NSInvocationOperation
//NSInvocationOperation在分線程中創(chuàng)建它的方法才是在分線程中執(zhí)行
NSInvocationOperation *operation =[[NSInvocationOperation  alloc] initWithTarget:self selector:@selector(one) object:nil];
[operation start];

-(void)one
{
    [NSThread isMainThread]?NSLog(@"主線程"):NSLog(@"分線程");
}

NSOperation 也是oc提供的關于多線程操作的管理類,但是它是一個抽象類 它的屬性和方法是不能自己使用的 是通過其子類來完成功能
NSOperationQueue線程隊列用于管理多線程操作的類
自定義NSOperation 自定義NSOperation 一般和NSOperationQueue一起使用 ,在實現(xiàn)的時候用-(void)main 方法來進行多線程操作

//自定義NSOperation 一般和NSOperationQueue一起使用
//NSOperationQueue 線程隊列 用于管理多線程操作的類
CustomOperation *operation2 = [[CustomOperation  alloc] init];
operation2.name =@"operation2";
CustomOperation *operation3 =[[CustomOperation   alloc] init];
operation3.name =@"operation4";
//創(chuàng)建隊列對象  來管理線程
NSOperationQueue *queue =[[NSOperationQueue alloc] init];
//添加要管理的線程  線程自動執(zhí)行main方法
[queue addOperation:operation2];
[queue addOperation:operation3];
//設置隊列的最大并發(fā)數(shù)
[queue setMaxConcurrentOperationCount:5];
//給operation2添加依賴關系operation3 如果優(yōu)先級和依賴關系沖突 以依賴關系為準
[operation2 addDependency:operation3];
//添加隊列優(yōu)先級別
[operation2 setQueuePriority:NSOperationQueuePriorityHigh];
[operation3 setQueuePriority:NSOperationQueuePriorityNormal];


#import <Foundation/Foundation.h>
@interface CustomOperation : NSOperation
@property (nonatomic,copy)NSString *name;
@end


#import "CustomOperation.h"
@implementation CustomOperation
//使用Operation main方法 來進行多線程操作
- (void)main
{
    if ([self.name isEqualToString:@"operation2"])
    {
        NSLog(@"operation2任務");
    }
    else
    {
        NSLog(@"operation3任務");
    }
}
@end

依賴關系和優(yōu)先級關系沖突,以依賴關系為準

3.GCD
單例類 單個 實例對象的類
APPLication \ NSFileManger \ NSUserDefaults \ NSNotification
特征
1.提供了一個統(tǒng)一初始化方法 來完成單例類的創(chuàng)建
2.可以使用單例類進行傳值操作,但是不要濫用單例類的傳值 因為內存問題
3.自定義單例類
1.要先提供一個標準的初始化方法
2.聲明static People *p = nil;
3.使用資源保護鎖對單例類的資源進行保護
4.重寫+(id)allocWithZone:(struct _NSZone *)zone 防止使用allow new 創(chuàng)建新的對象

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • Object C中創(chuàng)建線程的方法是什么?如果在主線程中執(zhí)行代碼,方法是什么?如果想延時執(zhí)行代碼、方法又是什么? 1...
    AlanGe閱讀 1,926評論 0 17
  • 線程、進程 1.iOS中的多線程操作、多線程方式? 2.多線程的優(yōu)點和缺點分別是什么? 答:優(yōu)點:1、將耗時較長的...
    丶逐漸閱讀 1,478評論 0 8
  • 進程和線程 首先,在了解多線程之前要了解什么是進程,什么是線程 什么是進程呢?進程是指在系統(tǒng)中正在運行的一個應用程...
    擱淺的青蛙閱讀 468評論 0 0
  • 多線程 在iOS開發(fā)中為提高程序的運行效率會將比較耗時的操作放在子線程中執(zhí)行,iOS系統(tǒng)進程默認啟動一個主線程,用...
    郭豪豪閱讀 2,726評論 0 4
  • 外境并無利害關系,一切的善惡取舍在于我們的心,心若不染不縛,則不會由此帶來分別和業(yè)的積累。
    輕言煦語閱讀 312評論 0 0

友情鏈接更多精彩內容