У меня есть статический объект, который запускает поток, но всякий раз, когда поток пытается выполнить селектор, я получаю «[NSThread initWithTarget: selector: object:]: target не реализует селектор» и приложение падаетNSThread не выполняет селектор
Heres мой код:
@implementation currentUser
{
NSThread *engineThread;
}
-(void)MessageEngineStart{
NSLog(@"[MDS]:Message Engine Started!");
if(engineThread == nil){
engineThread = [[NSThread alloc]init];
}
if(!engineThread.isExecuting){
[engineThread performSelectorInBackground:@selector(job) withObject:nil];//here is where it crashes
NSLog(@"[MDS]: Thread Will perform job in background.");
}
else{
NSLog(@"[MDS]: Thread is being executed.");
}
[NSTimer scheduledTimerWithTimeInterval:30 target:self selector:@selector(MessageEngineStart) userInfo:nil repeats:NO];
}
-(void)job
{
//JOB
}
как нить и работа находятся на том же объекте. , если я просто использовать
[NSThread detachNewThreadSelector:@selector(job) toTarget:self withObject:nil];
все идет хорошо ...
Что я делаю неправильно?
действительно, хотя об этом, но мне нужно выполнять эту работу каждые 30 секунд. Мой таймер вызывает метод «messageEngineStart» каждые 30 секунд. если я вызываю [self performSelectorInBackground: @selector (job) withObject: nil]; все время ... это создавало бы новый поток каждый раз? что делает стек больше и больше? –
Это нормально, хотя вы должны рассмотреть возможность использования повторяющегося таймера. Таймер - это триггер, и вы можете запустить фоновый поток одним из нескольких способов. Как потоки создаются или используются повторно с помощью 'performSelectorInBackground', вам действительно не нужно беспокоиться. В любом случае вы должны написать код безопасного потока. – Wain
сделает это тогда ... –