Почему 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()
создает и запускает цикл выполнения в этой теме. Только нет ничего привязанного к циклу выполнения, поэтому он сразу выходит.