关于NSObjCRuntime类的几个枚举属性

2021-08-10  本文已影响0人  浅_若清风
一.NS_CLOSED_ENUM

操作数的比较

typedef NS_CLOSED_ENUM(NSInteger, NSComparisonResult)
 {
    NSOrderedAscending = -1L,//左边的字符大于右边的字符
    NSOrderedSame,//左边的字符等于右边的字符
    NSOrderedDescending//左边的字符大于右边的字符
};

示例:App版本升级时,使用NSString的"compare...options..."方法对版本号进行比较

if ([@"版本号A" compare:@"版本号B" options:NSNumericSearch] != NSOrderedDescending) 
{
     //版本号A>版本号B
}
二.NS_OPTIONS

数组的并发混序、倒序遍历方法

typedef NS_OPTIONS(NSUInteger, NSEnumerationOptions)
 {
    NSEnumerationConcurrent = (1UL << 0),//并行发生, 并发混序
    NSEnumerationReverse = (1UL << 1),//倒序执行
};

示例:idx表示数组的下标位置,obj表示数组小标位置对应的值

NSMutableArray *arr = [NSMutableArray arrayWithObjects:@"A",@"B",@"C", nil];[arr enumerateObjectsWithOptions:NSEnumerationReverse usingBlock:^(id  _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop)
 {
        NSLog(@"位置:%ld,值:%@",idx,obj);
}];
//打印的值为
位置:2,值:C
位置:1,值:B
位置:0,值:A
三.NS_OPTIONS
typedef NS_OPTIONS(NSUInteger, NSSortOptions)
 {
    NSSortConcurrent = (1UL << 0),//高效的但不稳定的排序算法(快速排序)
    NSSortStable = (1UL << 4),//稳定的排序算法(冒泡排序、插入排序)
};

示例:使用NSArray的"sortedArrayWithOptions...usingComparator..."方法进行排序,obj1和obj2是遍历数组时读取出的元素,可对obj1和obj2进行排序指定或判断。

NSMutableArray *arr = [NSMutableArray arrayWithObjects:@"A",@"B",@"C", nil];
NSArray *resultArray = [arr sortedArrayWithOptions:NSSortStable usingComparator:^NSComparisonResult(id obj1, id obj2)
 {
        //在此进行操作
        return [obj1 compare:obj2];
}];
NSLog(@"结果值:%@",resultArray);
//打印的值为
结果值:A
结果值:B
结果值:C
四. NS_ENUM
typedef NS_ENUM(NSInteger, NSQualityOfService)
 {
    NSQualityOfServiceUserInteractive = 0x21,//最高优先级(用于用户交互事件。如动画,需一瞬间完成)
    NSQualityOfServiceUserInitiated = 0x19,//次高优先级(用户发起的并且需要立即得到结果的任务。如tableview的cell加载,需几秒内完成)
    NSQualityOfServiceUtility = 0x11,//普通优先级(如下载任务,不需要立刻返回结果)
    NSQualityOfServiceBackground = 0x09,//最低优先级(用户不可见任务。如后台备份操作,需长时间才能完成)
    NSQualityOfServiceDefault = -1//默认优先级(当没有 QoS信息时默认使用)
} API_AVAILABLE(macos(10.10), ios(8.0), watchos(2.0), tvos(9.0));

示例:在线程中使用优先级,qualityOfService为设置线程优先级的属性。

//创建线程
NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(threadload) object:nil];
//设置线程优先级
thread.qualityOfService = NSQualityOfServiceDefault;
//启动线程
[self.thread start];
- (void)threadload
{
    //设置名字
    [[NSThread currentThread] setName:@"name"];
    NSRunLoop *loop = [NSRunLoop currentRunLoop];
    //添加数据
    [loop addPort:[NSMachPort port] forMode:NSDefaultRunLoopMode];
    while (![[NSThread currentThread] isCancelled])
    {
        //启动NSRunLoop
        [loop runMode:NSDefaultRunLoopMode beforeDate:[NSDate dateWithTimeIntervalSinceNow:10]];
    }
}
上一篇 下一篇

猜你喜欢

热点阅读