美文网首页iOS技术图谱
iOS技术图谱之NSThread

iOS技术图谱之NSThread

作者: iOS大蝠 | 来源:发表于2019-11-15 20:58 被阅读0次

    NSThread

    1、什么是NSThread?

    NSThread是苹果官方提供面向对象操作线程的技术,简单方便,可以直接操作线程对象,不过需要自己控制线程的生命周期。在平时使用很少,最常用到的无非就是 [NSThread currentThread]获取当前线程。

    2、NSThread的使用

    (1)线程的创建

    /**
      block方式
    */
    + (void)detachNewThreadWithBlock:(void (^)(void))block;
    /**
      SEL方式
    */
    + (void)detachNewThreadSelector:(SEL)selector toTarget:(id)target withObject:(nullable 
    
    //参数一:提供selector的对象,通常是self,参数2:要执行的方法,参数3:传递给selector的参数(如果selector方法不带参数,就使用nil)
    NSThread *thread = [[NSThread alloc]initWithTarget:self selector:@selector(doSomething) object:nil];
    
    //隐式创建并启动线程,第一个参数为调用的方法,第二个参数为传给selector方法的参数
    - (void)performSelectorInBackground:(SEL)aSelector withObject:(id)arg
    
    

    (2)NSThread常见属性

    //只读属性,线程是否在执行
    thread.isExecuting;
    //只读属性,线程是否被取消
    thread.isCancelled;
    //只读属性,线程是否完成
    thread.isFinished;
    //是否是主线程
    thread.isMainThread;
    //线程的优先级,取值范围0.0到1.0,默认优先级0.5,1.0表示最高优     //先级,优先级高,CPU调度的频率高
    thread.threadPriority;
    //线程的堆栈大小,线程执行前堆栈大小为512K,线程完成后堆栈大小       为0K
    //注意:线程执行完毕后,由于内存空间被释放,不能再次启动
    thread.stackSize;
    

    (3)线程启动和取消

    //线程开始,线程加入线程池等待CPU调度(并非真正开始执行,只是通常等待时间都非常短,看不出效果)
    [thread start];
    if(!thread.isCancelled){//在执行之前需要先确认线程状态,如果已经取消就直接返回
        [thread cancel]; //通知线程取消,可以在外不终止线程执行
    }else{
        return;
    }
    

    (4)常用方法

    //获取当前线程
    [NSThread currentThread];
    
    //阻塞线程
    //休眠到指定时间
    [NSThread sleepUntilDate:[NSDate date]];
    //休眠指定时长
    [NSThread sleepForTimeInterval:4.5];
    
    //退出线程
    [NSThread exit];
    //当前线程是否为主线程
    [NSThread isMainThread];
    //是否多线程
    [NSThread isMultiThreaded];
    //返回主线程的对象
    NSThread *mainThread = [NSThread mainThread];
    

    (5)隐式创建和线程间通信

    /**
      指定方法在主线程中执行
    参数1. SEL 方法
        2.方法参数
        3.是否等待当前执行完毕
        4.指定的Runloop model
    */
    - (void)performSelectorOnMainThread:(SEL)aSelector withObject:(nullable id)arg waitUntilDone:(BOOL)wait modes:(nullable NSArray<NSString *> *)array;
    - (void)performSelectorOnMainThread:(SEL)aSelector withObject:(nullable id)arg waitUntilDone:(BOOL)wait;
        // equivalent to the first method with kCFRunLoopCommonModes
    /**
      指定方法在某个线程中执行
    参数1. SEL 方法
        2.方法参数
        3.是否等待当前执行完毕
        4.指定的Runloop model
    */
    - (void)performSelector:(SEL)aSelector onThread:(NSThread *)thr withObject:(nullable id)arg waitUntilDone:(BOOL)wait modes:(nullable NSArray<NSString *> *)array API_AVAILABLE(macos(10.5), ios(2.0), watchos(2.0), tvos(9.0));
    - (void)performSelector:(SEL)aSelector onThread:(NSThread *)thr withObject:(nullable id)arg waitUntilDone:(BOOL)wait API_AVAILABLE(macos(10.5), ios(2.0), watchos(2.0), tvos(9.0));
        // equivalent to the first method with kCFRunLoopCommonModes
    /**
      指定方法在开启的子线程中执行
    参数1. SEL 方法
        2.方法参数
    */
    - (void)performSelectorInBackground:(SEL)aSelector withObject:(nullable id)arg API_AVAILABLE(macos(10.5), ios(2.0), watchos(2.0), tvos(9.0))
    

    相关文章

      网友评论

        本文标题:iOS技术图谱之NSThread

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