多线程几种常用方案

1.GCD 加载图片过程
#import "UIImageView+DispatchLoad.h"  
@implementation UIImageView (DispatchLoad)  
- (void) setImageFromUrl:(NSString*)urlString {  
    [self setImageFromUrl:urlString completion:NULL];  
}  
- (void) setImageFromUrl:(NSString*)urlString   
              completion:(void (^)(void))completion {  
      
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{  
          
        NSLog(@"Starting: %@", urlString);  
        UIImage *avatarImage = nil;   
        NSURL *url = [NSURL URLWithString:urlString];  
        NSData *responseData = [NSData dataWithContentsOfURL:url];  
        avatarImage = [UIImage imageWithData:responseData];  
        NSLog(@"Finishing: %@", urlString);  
          
        if (avatarImage) {  
            dispatch_async(dispatch_get_main_queue(), ^{  
                self.image = avatarImage;  
            });  
            dispatch_async(dispatch_get_main_queue(), completion);  
        }  
        else {  
            NSLog(@"-- impossible download: %@", urlString);  
        }  
    });     
}  
@end  


2.1 NSThread 有两种直接创建方式:

- (id)initWithTarget:(id)target selector:(SEL)selector object:(id)argument

+ (void)detachNewThreadSelector:(SEL)aSelector toTarget:(id)aTarget withObject:(id)anArgument

第一个是实例方法,第二个是类方法

1、[NSThread detachNewThreadSelector:@selector(doSomething:) toTarget:self withObject:nil];2、NSThread* myThread = [[NSThread alloc] initWithTarget:self selector:@selector(doSomething:) object:nil];[myThread start];

例:

//    NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(loadUserList) object:nil];

//      [thread start];

//   [NSThread detachNewThreadSelector:@selector(loadUserList) toTarget:self withObject:nil];

   

2.2参数的意义:

selector :线程执行的方法,这个selector只能有一个参数,而且不能有返回值。

target  :selector消息发送的对象

argument:传输给target的唯一参数,也可以是nil

第一种方式会直接创建线程并且开始运行线程,第二种方式是先创建线程对象,然后再运行线程操作,在运行线程操作前可以设置线程的优先级等线程信息

2.3 PS:不显式创建线程的方法:

用NSObject的类方法  performSelectorInBackground:withObject: 创建一个线程:

[Obj performSelectorInBackground:@selector(doSomething) withObject:nil];  

2.4.2线程间通讯

线程下载完图片后怎么通知主线程更新界面呢?

[self performSelectorOnMainThread:@selector(updateUI:) withObject:image waitUntilDone:YES];

performSelectorOnMainThread是NSObject的方法,除了可以更新主线程的数据外,还可以更新其他线程的比如:
用:performSelector:onThread:withObject:waitUntilDone: 


3.利用 
NSOperationQueue 线程存储
3.1 建立子类

NSOperationQueue * contactOperationQueue = [[NSOperationQueue allocinit];

     [contactOperationQueue setMaxConcurrentOperationCount:1];

     DownLocalContact * downloadContact = [[DownLocalContact allocinitWithDelegate:self];

    [downloadContact setCompletionBlock:^{

                NSLog(@"download and save Data sucess!");

    }];

     [downloadContact setQueuePriority:NSOperationQueuePriorityVeryLow];

      [contactOperationQueue  addOperation :downloadContact];    
3.2 直接引用
#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
    NSInvocationOperation *operation = [[NSInvocationOperation alloc]initWithTarget:self
                                                                           selector:@selector(downloadImage:)
                                                                             object:kURL];
    
    NSOperationQueue *queue = [[NSOperationQueue alloc]init];
    [queue addOperation:operation];
// Do any additional setup after loading the view, typically from a nib.
}

-(void)downloadImage:(NSString *)url{
    NSLog(@"url:%@", url);
    NSURL *nsUrl = [NSURL URLWithString:url];
    NSData *data = [[NSData alloc]initWithContentsOfURL:nsUrl];
    UIImage * image = [[UIImage alloc]initWithData:data];
    [self performSelectorOnMainThread:@selector(updateUI:) withObject:image waitUntilDone:YES];
}
-(void)updateUI:(UIImage*) image{
    self.imageView.image = image;
}  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值