美文网首页
多线程 - NSThread

多线程 - NSThread

作者: Hayder | 来源:发表于2016-11-22 11:40 被阅读8次
    内容结构框图.png

    创建和启动线程简单说明

    一个NSThread对象就代表一个线程
    

    1.创建,启动线程

    1.1创建线程(3中方法)

    方法1:
    1.创建一个线程
    NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(run) object:nil];
    
    2.启动一个线程
    [thread start];
    
    执行完上面两个步骤以后,就会在线程NSThread中执行self的run方法
    
    方法2:
    创建线程后自动启动线程
    [NSThread detachNewThreadSelector: self toTarget:@selector(run) withObject:nil];
    
    方法3:
    隐式创建并启动线程  obj为run方法中传入的参数 没有传nil
    [self performSelectorInBackground:@selector(run) withObject:nil];
    
    线程参数设置
    1.设置线程的调度优先级 调度优先级的取值范围是0.0 ~ 1.0,默认0.5,值越大,优先级越高
    + (BOOL)setThreadPriority:(double)p;
    
      获取优先级
    + (double)threadPriority;
    
    2.设置线程的名字
    - (void)setName:(NSString *)n;
    
    - (NSString *)name;
    
    3.获取当前的线程
    NSThread *current = [NSThread currentThread];
    
    3种方法的区别
    方法1  优点:可以对线程进行一些详细的设置,如:线程名,优先级
          缺点:需要执行start方法才能启动线程
    方法2,3 优点:快速创建线程执行方法 
            缺点:无法对线程属性进行设置
    

    2.主线程的相关用法

    + (NSThread)mainThread;   获得主线程
    + (BOOL)isMainThread;    是否为主线程
    - (BOOL)isMainThread;    是否为主线程
    
    在主线程中执行某些方法
    方式1
    [self performSelectorOnMainThread:@selector(settingImage:) withObject:image waitUntilDone:NO];
    方式2
    [self.imageView performSelector:@selector(setImage:) onThread:[NSThread mainThread] withObject:image waitUntilDone:NO];
    方式3
    [self.imageView performSelectorOnMainThread:@selector(setImage:) withObject:image waitUntilDone:NO];
    

    3.NSThread应用例子(线程之间的通讯)

    应用场景:

    1.一个线程传数据给另外一个线程
    2.在一个线程中执行完特定的任务后,转到另外一个线程继续执行任务
    

    线程间通讯常用方法

    在主线程中执行某个方法
    - (void)performSelectorOnMainThread:(SEL)aSelector withObject:(id)arg waitUntilDone:(BOOL)wait;
    在子线程中执行某个方法
    - (void)performSelector:(SEL)aSelector onThread:(NSThread *)thr withObject:(id)arg waitUntilDone:(BOOL)wait;
    

    应用场景

    点击屏幕开始下载图片
    -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
    {
         [self performSelectorInBackground:@selector(download) withObject:nil];
    }
    
    -(void)download
    {
        1.下载图片
        NSURL *urlstr=[NSURL URLWithString:@"bigSea"];
        
        2.把图片转换为二进制的数据
        NSData *data=[NSData dataWithContentsOfURL:urlstr];//这一行操作会比较耗时
    
        3.把数据转换成图片
        UIImage *image=[UIImage imageWithData:data];
        
        4.回到主线程设置图片
        [self performSelectorOnMainThread:@selector(settingImage:) withObject:image waitUntilDone:NO];
    }
    
    
    -(void)settingImage:(UIImage *)image
    {
        self.iconView.image=image;
    }

    相关文章

      网友评论

          本文标题:多线程 - NSThread

          本文链接:https://www.haomeiwen.com/subject/sbuppttx.html