我正在使用 Objective-C 开发 iOS 框架。
我dispatch_queue_t
通过使用创建了一个dispatch_queue_create
. 并调用CFRunLoopRun()
运行队列中的runloop。
但是,看起来dispatch_queue_t共享了RunLoop。有些类添加了一个无效的计时器,当我调用它时CFRunLoopRun()
,它在我这边崩溃了。
- (void)viewDidLoad {
[super viewDidLoad];
self.queue1 = dispatch_queue_create("com.queue1", DISPATCH_QUEUE_CONCURRENT);
self.queue2 = dispatch_queue_create("org.queue2", DISPATCH_QUEUE_CONCURRENT);
}
- (IBAction)btnButtonAction:(id)sender {
dispatch_async(self.queue1, ^{
NSString *runloop = [NSString stringWithFormat:@"%@", CFRunLoopGetCurrent()];
runloop = [runloop substringWithRange:NSMakeRange(0, 22)];
NSLog(@"Queue1 %p run: %@", self.queue1, runloop);
//NSTimer *timer = [[NSTimer alloc] initWithFireDate:[NSDate date] interval:1 target:self selector:@selector(wrongSeletor:) userInfo:nil repeats:NO];
//[[NSRunLoop currentRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];
});
dispatch_async(self.queue2, ^{
NSString *runloop = [NSString stringWithFormat:@"%@", CFRunLoopGetCurrent()];
runloop = [runloop substringWithRange:NSMakeRange(0, 22)];
NSLog(@"Queue2 %p run: %@", self.queue2, runloop);
CFRunLoopRun();
});
}
有时他们采用相同的 RunLoop:
https://isstatic.askoverflow.dev/wGcv3.png
=====
您可以通过取消注释代码来查看崩溃情况NSTimer
。NSTimer已添加,但调用queue1
时仍在运行。CFRunLoopRun()
queue2
我读过一些描述,例如:需要一些有关调度队列、线程和 NSRunLoop 的说明
他们告诉我们:system creates a run loop for the thread
。但是,在我的检查中,他们正在共享 RunLoop。
这对我来说很伤心,因为我在调用生产时面临着崩溃的情况CFRunLoopRun()
。