2015-01-19 3 views
0

У меня есть статический объект, который запускает поток, но всякий раз, когда поток пытается выполнить селектор, я получаю «[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]; 

все идет хорошо ...

Что я делаю неправильно?

ответ

3

Вам не нужно создать поток для этого, вы должны просто называть

[self performSelectorInBackground:@selector(job) withObject:nil]; 

, потому что это ваш класс, который реализует job и не NSThread класса. Когда вы звоните

[NSThread detachNewThreadSelector:@selector(job) toTarget:self withObject:nil]; 

ваш используют NSThread вызвать job на self так это работает.

+0

действительно, хотя об этом, но мне нужно выполнять эту работу каждые 30 секунд. Мой таймер вызывает метод «messageEngineStart» каждые 30 секунд. если я вызываю [self performSelectorInBackground: @selector (job) withObject: nil]; все время ... это создавало бы новый поток каждый раз? что делает стек больше и больше? –

+0

Это нормально, хотя вы должны рассмотреть возможность использования повторяющегося таймера. Таймер - это триггер, и вы можете запустить фоновый поток одним из нескольких способов. Как потоки создаются или используются повторно с помощью 'performSelectorInBackground', вам действительно не нужно беспокоиться. В любом случае вы должны написать код безопасного потока. – Wain

+0

сделает это тогда ... –