什么時候使用多線程編程:執(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)建新的對象