Почему CFRunLoopRun не работает?

[self request]; //main thread

- (void)request {
    [self performSelectorInBackground:@selector(regFun) withObject:nil];
}

- (void)regFun {
    CFRunLoopRun();
    CCLOG(@"CFRunLoopRun not work");
}

Учитывая предыдущий код, знаете ли вы, почему CFRunLoopRun() не работает?. Мне нужно позвонить regFun в фоновом режиме.

Есть ли другие способы остановить фоновый поток?

3 ответа

Это может работать.

[self request]; //main thread

- (void)request {
    //[self performSelectorInBackground:@selector(regFun) withObject:nil];
    [NSTimer scheduledTimerWithTimeInterval:0 target:self selector:@selector(regFun) userInfo:nil repeats:NO];
}

- (void)regFun {
    CFRunLoopRun();
    CCLOG(@"CFRunLoopRun not work");
}

Но я не уверен, что это правильный подход, и я не знаю, что случилось.:(

Хорошо, так как вы не говорите нам, что вам действительно нужно делать, давайте догадаемся. Если вы просто хотите запустить селектор в фоновом режиме, попробуйте Grand Central Dispatch:

- (void) request {
    dispatch_async(dispatch_get_global_queue(0, 0), ^{
        [self regFun];
    });
}

- (void) regFun {
    // Running in background, with a run loop available
    // and an autorelease pool, too. After the code finishes:
    dispatch_async(dispatch_get_main_queue(), ^{
        // Will be called on the main thread.
        [self reportBackgroundTaskFinished];
    });
}

regFun находится в фоновом потоке, поэтому вызов CFRunLoopRun() создает и запускает цикл выполнения в этой теме. Только нет ничего привязанного к циклу выполнения, поэтому он сразу выходит.

Другие вопросы по тегам