1.NSThread 每個NSThread對象對應(yīng)一個線程鹰霍,真正最原始的線程豹休。
- 優(yōu)點:NSThread輕量級最低,相對簡單敏晤。
- 缺點:手動管理所有的線程活動贱田,如生命周期、線程同步嘴脾、睡眠等男摧。
方法1:使用對象方法
創(chuàng)建一個線程,第一個參數(shù)是請求的操作译打,第二個參數(shù)是操作方法的參數(shù)
NSThread *thread=[[NSThread alloc]initWithTarget:self selector:@selector(loadImage) object:nil];
啟動一個線程耗拓,注意啟動一個線程并非就一定立即執(zhí)行,而是處于就緒狀態(tài)奏司,當(dāng)系統(tǒng)調(diào)度時才真正執(zhí)行
[thread start];
方法2:使用類方法
[NSThread detachNewThreadSelector:@selector(loadImage) toTarget:self withObject:nil];
2. NSOperation 自帶線程管理的抽象類
- 優(yōu)點:自帶線程周期管理,操作上可更注重自己邏輯乔询。
- 缺點:面向?qū)ο蟮某橄箢?只能實現(xiàn)它或者使用它定義好的兩個子類:NSInvocationOperation和NSBlockOperation。
創(chuàng)建操作隊列
NSOperationQueue *operationQueue=[[NSOperationQueue alloc]init];
operationQueue.maxConcurrentOperationCount=5; 設(shè)置最大并發(fā)線程數(shù)
創(chuàng)建多個線程用于填充圖片
方法1:NSBlockOperation
-
創(chuàng)建操作塊添加到隊列
NSBlockOperation *blockOperation=[NSBlockOperation blockOperationWithBlock:^{ [self loadImage]; }]; [operationQueue addOperation:blockOperation];
-
直接使用操隊列添加操作
[operationQueue addOperationWithBlock:^{ [self loadImage]; }];
方法2 : NSInvocationOperation
NSInvocationOperation *invocationOperation=[[NSInvocationOperation alloc]initWithTarget:self selector:@selector(loadImage) object:nil];
[operationQueue addOperation:invocationOperation];
-(void)loadImage{
//請求數(shù)據(jù)
NSData *data= [self requestData];
NSLog(@"%@",[NSThread currentThread]);
//更新UI界面,此處調(diào)用了主線程隊列的方法(mainQueue是UI主線程)
//利用NSTread
[self performSelectorOnMainThread:@selector(updateImage:) withObject:data waitUntilDone:YES];
//利用NSOperation
// [[NSOperationQueue mainQueue] addOperationWithBlock:^{
// [self updateImage:data];
// }];
}
-(NSData *)requestData{
//對于多線程操作建議把線程操作放到@autoreleasepool中
@autoreleasepool {
NSURL *url=[NSURL URLWithString:@"http://image16.360doc.com/DownloadImg/2010/10/2812/6422708_2.jpg"];
NSData *data=[NSData dataWithContentsOfURL:url];
return data;
}
}
-(void)updateImage:(NSData *)data{
UIImage *image=[UIImage imageWithData:data];
_imageView.image=image;
}