1.NSThread
- 启动子线程
1、[thread start]
2、detachNewThreadSelector
3、performSelectorInBackground(推荐)
//方法1:使用对象方法
//创建一个线程,第一个参数是请求的操作,第二个参数是操作方法的参数
NSThread *thread=[[NSThread alloc]initWithTarget:self selector:@selector(loadImage) object:nil];
//启动一个线程,注意启动一个线程并非就一定立即执行,而是处于就绪状态,当系统调度时才真正执行
[thread start];
//方法2:使用类方法
[NSThread detachNewThreadSelector:@selector(loadImage) toTarget:self withObject:nil];
// 方法3:使用 performSelectorInBackground
[self performSelectorInBackground:@selector(loadImage:) withObject:[NSNumber numberWithInt:i]];
- 回到主线程
performSelectorOnMainThread,是NSObject的分类方法,每个NSObject对象都有此方法
[self performSelectorOnMainThread:@selector(updateImage:) withObject:data waitUntilDone:YES];
2.NSBlockOperation
- 启动子线程
//创建操作队列
NSOperationQueue *operationQueue=[[NSOperationQueue alloc]init];
operationQueue.maxConcurrentOperationCount=5;//设置最大并发线程数
[operationQueue addOperationWithBlock:^{
[self loadImage:[NSNumber numberWithInt:i]];
}];
- 回到主线程
[[NSOperationQueue mainQueue] addOperationWithBlock:^{
[self updateImageWithData:data andIndex:i];
}];
3.GCD
- 启动子线程
/*创建一个串行队列
第一个参数:队列名称
第二个参数:队列类型
*/
dispatch_queue_t serialQueue=dispatch_queue_create("myThreadQueue1", DISPATCH_QUEUE_SERIAL);//注意queue对象不是指针类型
dispatch_async(serialQueue, ^{
[self loadImage:[NSNumber numberWithInt:i]];
});
- 回到主线程
// 获取主线程
dispatch_queue_t mainQueue= dispatch_get_main_queue();
dispatch_sync(mainQueue, ^{
[self updateImageWithData:data andIndex:i];
});
锁机制 @synchronized
解决资源抢占的问题
-(NSData *)requestData:(int )index{
NSData *data;
NSString *name;
//线程同步
@synchronized(self){
if (_imageNames.count>0) {
name=[_imageNames lastObject];
[_imageNames removeObject:name];
}
}
if(name){
NSURL *url=[NSURL URLWithString:name];
data=[NSData dataWithContentsOfURL:url];
}
return data;
}
网友评论