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

[self request]; //main thread

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

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

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

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


person wupei    schedule 12.01.2012    source источник
comment
Что именно ты пытаешься сделать? Скорее всего, есть более простой способ.   -  person zoul    schedule 12.01.2012
comment
Проверьте документы.   -  person Georg Fritzsche    schedule 12.01.2012


Ответы (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");
}

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

person wupei    schedule 13.01.2012

Хорошо, поскольку вы не говорите нам, что вам действительно нужно сделать, давайте угадаем. Если вы просто хотите запустить селектор в фоновом режиме, попробуйте 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];
    });
}
person zoul    schedule 14.01.2012

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

person joerick    schedule 12.01.2012
comment
Я не понимаю. Если я сделаю это. CFRunLoopRun() может работать. [самостоятельный селектор:@селектор(regFun)]; Но мне нужно вызвать regFun в фоновом режиме. Потому что я надеюсь, что основной поток продолжит работу. - person wupei; 12.01.2012
comment
что вы имеете в виду, что к циклу выполнения ничего не подключено? Разве он не должен работать, даже если нет ожидающих операций? например ждать новых операций? - person paiego; 13.03.2012
comment
@paiego нет, это не так работает. Цикл выполнения завершится, если к нему ничего не прикреплено. Вы можете прикрепить к нему таймер, и он будет работать бесконечно. developer.apple.com/library/mac/documentation/Cocoa/Reference/ - person joerick; 14.03.2012