Estou desenvolvendo framework iOS com Objective-C.
Eu crio um dispatch_queue_t
usando dispatch_queue_create
. E ligue CFRunLoopRun()
para executar o runloop na fila.
Mas, parece que o dispatch_queue_t compartilhou o RunLoop. Algumas classes adicionaram um cronômetro inválido e, quando eu chamo o CFRunLoopRun()
, ele travou do meu lado.
- (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();
});
}
Algum tempo eles levam o mesmo RunLoop:
https://isstatic.askoverflow.dev/wGcv3.png
=====
Você pode ver a falha descomentando o código de NSTimer
. O NSTimer foi adicionado queue1
, mas ainda está em execução quando CFRunLoopRun()
chamado queue2
.
Eu li algumas descrições como: preciso de alguns esclarecimentos sobre fila de despacho, thread e NSRunLoop
Eles contaram que: system creates a run loop for the thread
. Mas, na minha opinião, eles estão compartilhando o RunLoop.
Isso é triste para mim, pois enfrento que acontecem travamentos ao chamar CFRunLoopRun()
a produção.