Проблемы с новой веткой

После многих попыток вызова функции в новом потоке у меня работал только приведенный ниже код

[NSThread detacNewThreadSelector:@selector(temp:) toTarget:self withObject:self];

Ниже не работает:

NSThread *updateThread1 = [[NSThread alloc] initWithTarget:self selector:@selector(temp:) object:self];
NSThread *updateThread1 = [[NSThread alloc] init];
  [self performSelector:@selector(temp:) onThread:updateThread1 withObject:self waitUntilDone:YES];

Теперь, когда я пытаюсь позвонить NSTimer или выполнить селектор в timer: Функция не работает Найти ниже код

int timeOutflag1 = 0;
-(void)connectCheckTimeOut
{
    NSLog(@"timeout");
    timeOutflag1 = 1;
}

-(void)temp:(id)selfptr
{
    //[selfptr connectCheckTimeOut];
    NSLog(@"temp");
    //[NSTimer scheduledTimerWithTimeInterval:5 target:selfptr selector:@selector(connectCheckTimeOut) userInfo:nil repeats:NO];
    [selfptr performSelector:@selector(connectCheckTimeOut) withObject:nil afterDelay:5];

}

- (IBAction)onUart:(id)sender {

    protocolDemo1 *prtDemo = [[protocolDemo1 alloc] init];

   //NSThread *updateThread1 = [[NSThread alloc] initWithTarget:self selector:@selector(temp:) object:self];
    //[self performSelector:@selector(temp:) onThread:updateThread1 withObject:self waitUntilDone:YES];
      // [updateThread1 start];
    [self performSelector:@selector(temp:) withObject:self afterDelay:0];

   while(1)
    {
        NSLog(@"Whieloop");
        if(timeOutflag1)
        {
            timeOutflag1 = 0;
            break;
        }
        if([prtDemo isConnected])
            break;

    }
}

Если я использую [self performSelector:@selector(connectCheckTimeOut) withObject:nil afterDelay:5]; в onUart Функция тогда она работает правильно, я могу видеть Timeoutprintf но внутри temp это не работает.

1 ответ

NSTimer основан на цикле выполнения, поэтому, если вы хотите использовать его в фоновом потоке, который вы порождаете и сами управляете, вам нужно будет запустить цикл запуска в этом потоке. Следить за публикациями NSRunLoop, Короткая версия может выглядеть примерно так:

- (void)timedMethod
{
    NSLog(@"Timer fired!");
}

- (void)threadMain
{
    NSRunLoop* rl = [NSRunLoop currentRunLoop];
    NSTimer* t = [NSTimer scheduledTimerWithTimeInterval: 1.0 target: self selector: @selector(timedMethod) userInfo:nil repeats:YES];
    [rl run];
}

- (void)spawnThread
{
    [NSThread detachNewThreadSelector: @selector(threadMain) toTarget:self withObject:nil];
}
Другие вопросы по тегам