Próbuję użyć osobnego wątku do pracy z niektórymi API.iPhone: jak korzystać performSelector: onThread: withObject: waitUntilDone: method?
Problem polega na tym, że nie jestem w stanie użyć metody performSelector:onThread:withObject:waitUntilDone:
z wątkiem, który stworzyłem dla tego.
Mój kod:
@interface MyObject : NSObject {
NSThread *_myThread;
}
@property(nonatomic, retain) NSThread *myThread;
@end
@implementation MyObject
@synthesize myThread = _myThread;
- (NSThread *)myThread {
if (_myThread == nil) {
NSThread *myThreadTemp = [[NSThread alloc] init];
[myThreadTemp start];
self. myThread = myThreadTemp;
[myThreadTemp release];
}
return _myThread;
}
- (id)init {
if (self = [super init]) {
[self performSelector:@selector(privateInit:) onThread:[self myThread] withObject:nil waitUntilDone:NO];
}
return self;
}
- (void)privateInit:(id)object {
NSLog(@"MyObject - privateInit start");
}
- (void)dealloc {
[_myThread release];
_myThread = nil;
[super dealloc];
}
@end
"MyObject - privateInit start"
nigdy nie zostanie wydrukowany.
Czego mi brakuje?
Próbowałem utworzyć instancję wątku z elementem docelowym i selektorem, próbowałem czekać na zakończenie wykonywania metody (waitUntilDone:YES
).
Nic nie pomaga.
AKTUALIZACJA:
Nie potrzebuję tej wielowątkowości do oddzielania kosztownych operacji na inny wątek.
W tym przypadku można użyć performSelectorInBackground
, jak wspomniano w kilku odpowiedziach.
Głównym powodem tego osobnego wątku jest potrzeba wykonania wszystkich czynności w API (TTS przez Loquendo) z jednego wątku.
To znaczy, że muszę tworzyć instancję obiektu TTS i wywoływać metody na tym obiekcie z tego samego wątku przez cały czas.
W ten sposób nie tworzysz nieskończonej pętli? Jeśli runloop nie ma nic do zrobienia, po prostu zniknie natychmiast i wszystko, co musisz zrobić, to wywołanie '- run' tak często, jak twój procesor może sobie poradzić. (Wykorzystanie procesora w 100%) – bastibe
Infinite - yes. Ale pętla nie jest powtarzana przez cały czas. Wrzuciłem linię dziennika (NSLog ...) w czasie i została ona wywołana tylko raz ... –
Jest to nieoczekiwane zachowanie i nie należy polegać na nim. Uruchomiona pętla bez skonfigurowanych źródeł wejściowych lub timerów powinna natychmiast wyjść, dlatego też pętla powinna działać nieprzerwanie w kółko, wykorzystując 100% procesora, jak powiedział plakat. Więcej informacji można znaleźć w dokumentach nsrunloop. –