一、RunLoop初体验~思考

NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:1 repeats:YES block:^(NSTimer * _Nonnull timer) {
    NSLog(@"%ld",(long)count++);
  }];
[self.view addSubview:self.tv_list];

写了个UITableView然后我增加个NSTimer,接下来回产生测试抑郁症什么事情呢?macos monterey 当滑动UITab线程leView时,NSTim测试你适合学心理学吗er计时器就会停止。 信任绝大多数开发者都遇到过这个问题,当然百度一下会macos系统有许多答线程池面试题案。

[[NSRunLoop currentRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];

增加这代码就完美的处理了这个问题,可是为什么会这样呢? 猜想必定跟NSRunLoop有线程安全关。那NSRunLmacoscatalinaoop是什么?

1、NSRunLooios15p是什么macoscatalina

一、RunLoop初体验~考虑

NSRunLoop目标处理源的输入,例如来自窗口体系和NSPorios14.4.1更新了什么t目标的鼠标和键盘事情。NSRunLoop目标也处理NSTimer事情。

你的应用程序既不创立也不显式管理NSRunLoop目标。体系根据需要为每个NSThread目标创立一个NSRunios是苹果还是安卓Loop目标,包括应用程序的主线程。如果您需要拜访当时线程的运转循环,请使用类办法currentRunLoop

留意,从NSRunLoop的视点来看,NSTi线程mer目标不是“输入”——它们是一种特殊的类型,当它们触发运转循环时,它们不会导致运转循线程环返回。

好像也看不理解说的什么意思。 通俗易懂的话这玩意是个死循macos10136怎么升级环,在有事情呼应的时分,RunLoop去处能够呼应处理一些事情,没有事情呼应的时分RunLoop会进入休眠,macos系统而且他和线程是一一对应的。一个线程里边有的话只能够拥有一个Rmacos是什么意思unLo线程池的七个参数op。

2、NSRunLoopMode是什么?

一、RunLoop初体验~考虑

Modes that a run loop operates in. 各位自行翻译吧。

一、RunLoop初体验~考虑

目前NSRunLoopMode有这5种,可是只要NSDefaultRunLoopMode UITrackingRunLoopModel NSRunLoopCommonModes这三种是用于iOS上面的,剩余两种是用于MacOS上的。

NSDefaultRunLoopMode

一、RunLoop初体验~考虑

设置为处理衔接目标以外的输入源的形式。

UITrackingRunL线程的几种状态oopModel

一、RunLoop初体验~考虑

在控件中进行盯梢时设置的形式。

NSRunLoopCommonModes

一、RunLoop初体验~考虑

包括一个或多个其他运转循环形式的伪形式。

其实这macosmojave个伪形式中包括了NSDefaultRunLoopMode|UITrackingRunLoopModel这两种形式

3、测试

__block NSInteger count = 0;
NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:1 repeats:YES block:^(NSTimer * _Nonnull timer) {
    NSLog(@"%ld",(long)count++);
    //增加这行代码
    NSLog(@"Timer的currentModel=%@",[[NSRunLoop currentRunLoop] currentMode]);
  }];
**RunLoopTest[58445:4388936] Timer的currentModel=kCFRunLoopDefaultMode**

NSTimer在运转过程中打印出来的Mode为kCFRunLoopDefault线程Mode这个mode其实这个mode就等于NSDefaultRunLoopMode 由于NSRunLoop是根据CKRunLoop开发的。所以NSTimer在计不时RunLoop的线程数是什么Model为Nios越狱SDefaultRunLoopMode

- (void)scrollViewDidScroll:(UIScrollView *)scrollView{
  NSLog(@"TableView滑动---%@", [[NSRunLoop currentRunLoop] currentMode]);
}

接下来在scrollViewDidScroll这个代理办法里边增测试英文加上滑动监听

**RunLoopTest[58641:4397470] TableView滑动---UITrackingRunLoopMode**

所以基本上ios应用商店能够分析出来为什么在UITableView滑动的时分NSTimer计时不起作用,由于在UITableView滑动的时分当时主线程的RunLoop的Mode切换到了UITrackingRunLoopModemacOS这个形式可是N线程池STimer只在NSDefaultRunLoomacos系统pMode做呼应,当UITablios系统eView停止的时分RunLoop的Mode又会切回到NSDefaultRun线程池LoopMode,所以如果把NSTimer在当时RunLoop中的形式增加为NSRunLoopCommonModes那其实能够理解为NSTimer能够在NSDefaultRun线程的几种状态LoopMode | UITrackingRunLoopModel这两种形式中都起作用。

当增加测试抑郁程度的问卷[[NSRunLoop currentRunLoop] addTimer:tiOSimer forMode:NSRunLoopCommonModes];这行代码后:

**RunLoopTest[80618:4452646] 0**
**RunLoopTest[80618:4452646] Timer的currentModel=kCFRunLoopDefaultMode**
**RunLoopTest[80618:4452646] 1**
**RunLoopTest[80618:4452646] Timer的currentModel=kCFRunLoopDefaultMode**
**RunLoopTest[80618:4452646] TableView滑动---UITrackingRunLoopMode**
**RunLoopTest[80618:4452646] 2**
**RunLoopTest[80618:4452646] Timer的currentModel=UITrackingRunLoopMode**

能够发现当UITableView滑动的时分确实Timer的Mode变为了UITrackingRunLoopMode

接下来我如果把Timer的Mode直接增加成UITrackingRunLoopMode是否可行呢?

//  [[NSRunLoop currentRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];
  [[NSRunLoop currentRunLoop] addTimer:timer forMode:UITrackingRunLoopMode];
**RunLoopTest[80891:4465038] 0**
**RunLoopTest[80891:4465038] Timer的currentModel=kCFRunLoopDefaultMode**
**RunLoopTest[80891:4465038] TableView滑动---UITrackingRunLoopMode**
**RunLoopTest[80891:4465038] TableView滑动---UITrackingRunLoopMode**
**RunLoopTest[80891:4465038] 1**
**RunLoopTest[80891:4465038] Timer的currentModel=UITrackingRunLoopMode**

证明线程数越多越好吗也是能够一变滑动一遍计时,作用是相同的。测试工程师

更多的考虑

上面提到了线程安全一个线程只会对应一个Rios16unLoop,那如果在开辟一个线程去做计时可是不增加Timer的Model是否能够实现相同的作用呢?ios下载

- (void)viewDidLoad {
  [super viewDidLoad];
    //开启线程
  NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(startTimer) object:nil];
  [thread start];
  [self.view addSubview:self.tv_list];
//  [[NSRunLoop currentRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];
//  [[NSRunLoop currentRunLoop] addTimer:timer forMode:UITrackingRunLoopMode];
}
-(void)startTimer{
  __block NSInteger count = 0;
  NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:1 repeats:YES block:^(NSTimer * _Nonnull timer) {
    NSLog(@"%ld",(long)count++);
    NSLog(@"Timer的currentModel=%@",[[NSRunLoop currentRunLoop] currentMode]);
  }];
}

创立了这段代码,可是发现Timer根本没有执行线程撕裂者。这是由于什么呢? 原因是由于主线程的NSRunLoop是体系自己创立的所以不需要我们去创立它,可是我线程安全们创立的子线程是没有NSRunLoop的所以需要我们手动的去创立它才行。 增加这行代码[[NSRunLoop currentRunLoop] run];

- (void)viewDidLoad {
  [super viewDidLoad];
    //开启线程
  NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(startTimer) object:nil];
  [thread start];
  [self.view addSubview:self.tv_list];
//  [[NSRunLoop currentRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];
//  [[NSRunLoop currentRunLoop] addTimer:timer forMode:UITrackingRunLoopMode];
}
-(void)startTimer{
  __block NSInteger count = 0;
  NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:1 repeats:YES block:^(NSTimer * _Nonnull timer) {
    NSLog(@"%ld",(long)count++);
    NSLog(@"Timer的currentModel=%@",[[NSRunLoop currentRunLoop] currentMode]);
  }];
    //创立RunLoop
    [[NSRunLoop currentRunLoop] run];
}

这样NSTimacosx是什么文件夹mer正常的跑了起来。

macosx论: 所以经过macos系统上面的时macos10136怎么升级间得出NSTimer在UITableView滑动时无法作线程池的七个参数业是由于NSTimer作业是依托RunLoop,而UITableView的滑动呼应也是依托Run线程池的七个参数Loop,可是NSTimer默许是在NSDefaultRunLoopMode形式下去触发呼应的,而UITableView的滑动时主线程的RunLoop会切换到UITracmacos10136怎么升级kingRunLoopMode形式,所以NSTimer无法在UITableView滑动的时分作业,处理办法比较简单地就是给NSTimer增加NSRunLoopCommonModes这种伪测试英文形式或者直接增加macos是什么意思UITrackiios应用商店ngRunLoopMode形式。在本文中提到了创立一个子线程macosmojave而且给子线程增加RunLoop去处理NSTimer滑动计时的问macOS题,作者这里不推荐这种办法来实现,由于在实践开发中很容易呈现循环引证的问题,次办法仅仅为了测试下子线程的RunLoop,没必要画蛇添足去处理这种简单的问题。

发表评论

提供最优质的资源集合

立即查看 了解详情