iOS 多线程技术 NSThread

1、属性

// 获取当前线程的一些信息
@property (class, readonly, strong) NSThread *currentThread;
// 线程的一些本地属性,可以使用setObject:forkey:来配置
@property (readonly, retain) NSMutableDictionary *threadDictionary;  
// 线程优先级,最高为1.0(已废弃,用qualityOfService)
@property double threadPriority;
// 线程优先级
@property NSQualityOfService qualityOfService;

typedef NS_ENUM(NSInteger, NSQualityOfService) {
    /// 与用户交互有关的.高优先级,需要立即响应.
    NSQualityOfServiceUserInteractive = 0x21,
    /// 由用户发起的需要立即得到结果的任务,优先级比NSQualityOfServiceUserInteractive低
    NSQualityOfServiceUserInitiated = 0x19,
    /// 不需要马上返回结果的任务,优先级比NSQualityOfServiceUserInitiated低
    NSQualityOfServiceUtility = 0x11,
    /// 后台任务,可能是在后台备份用户数据什么的,优先级比NSQualityOfServiceUtility低
    NSQualityOfServiceBackground = 0x09,
    /// 默认优先级.比NSQualityOfServiceUserInitiated低比NSQualityOfServiceUtility高.
    NSQualityOfServiceDefault = -1
} API_AVAILABLE(macos(10.10), ios(8.0), watchos(2.0), tvos(9.0));

// 返回在该线程中函数调用的地址的一个数组
@property (class, readonly, copy) NSArray *callStackReturnAddresses;
// 使用代码的方式获取调用栈
@property (class, readonly, copy) NSArray *callStackSymbols;
// 线程名,主线程名为main
@property (nullable, copy) NSString *name;
// 线程使用的栈大小,默认512K,需要设置为4K的正整数倍,需要在start前设置,之后设置可以改变大小(表现为取值)但是不会影响栈区的真实页数
@property NSUInteger stackSize;
// 是否是主线程 (类属性,实例属性)
@property (readonly) BOOL isMainThread;
@property (class, readonly) BOOL isMainThread; 
// 是否是主线程
@property (class, readonly, strong) NSThread *mainThread;
// 线程是否正在执行,执行前和执行完毕都会返回NO.
@property (readonly, getter=isExecuting) BOOL executing ; 
// 线程是否完成
@property (readonly, getter=isFinished) BOOL finished;
// 线程是否取消,只有调用了- (void)cancell才会取消,如果线程执行完毕再调用- (void)cancell也是会返回YES…
// 线程是否取消
@property (readonly, getter=isCancelled) BOOL cancelled ;  

2、方法

// MAKR: 类方法

// 创建一个线程并且执行
+ (void)detachNewThreadWithBlock:(void (^)(void))block;
+ (void)detachNewThreadSelector:(SEL)selector toTarget:(id)target withObject:(nullable id)argument;

// 当前进程里面是否有多个子线程)
+ (BOOL)isMultiThreaded;

// 当前线程睡眠date
+ (void)sleepUntilDate:(NSDate *)date;

// 当前线程睡眠ti(秒)
+ (void)sleepForTimeInterval:(NSTimeInterval)ti;

// 退出当前线程
+ (void)exit;

// 获取线程优先级
+ (double)threadPriority;

// 设置线程优先级
+ (BOOL)setThreadPriority:(double)p;

// MARK: 实例方法

// 下面这三个方法都需要调用`- (void)start`来开启线程
- (instancetype)init;
- (instancetype)initWithTarget:(id)target selector:(SEL)selector object:(nullable id)argument;
- (instancetype)initWithBlock:(void (^)(void))block;

// 取消线程
- (void)cancel;

// 开启线程
- (void)start;

// 当子类化NSThread的时候可以通过重写该方法来改变入口
- (void)main;   // thread body method

// MARK: NSThreadPerformAdditions分类方法

// 调用主线程,传入一个与主线程RunLoop循环执行有关的数组
- (void)performSelectorOnMainThread:(SEL)aSelector withObject:(id)arg waitUntilDone:(BOOL)wait modes: (NSArray *)array;

// 调用主线程更新UI
- (void)performSelectorOnMainThread:(SEL)aSelector withObject:(id)arg waitUntilDone:(BOOL)wait;

// 调用指定的线程,传入一个与线程RunLoop循环执行有关的数组
- (void)performSelector:(SEL)aSelector onThread:(NSThread *) thread withObject:(id)arg waitUntilDone:(BOOL)wait modes:(NSArray  *)array;

// 调用指定的线程更新数据
- (void)performSelector:(SEL)aSelector onThread:(NSThread *)thread withObject:(id)arg waitUntilDone: (BOOL)wait;

// 在后台调用线程
- (void)performSelectorInBackground:(SEL)aSelector withObject:(id)arg;

3、通知

/// 将要变成多线程的通知
FOUNDATION_EXPORT NSNotificationName const NSWillBecomeMultiThreadedNotification;
/// 已经变成单线程的通知
FOUNDATION_EXPORT NSNotificationName const NSDidBecomeSingleThreadedNotification;
/// 线程将要退出的通知
FOUNDATION_EXPORT NSNotificationName const NSThreadWillExitNotification;

你可能感兴趣的:(iOS 多线程技术 NSThread)