Cocoa-Touch: executeSelectorOnMainThread: странное поведение + сбой
У меня ситуация, когда я лениво загружаю изображения с www.
Это список элементов, когда один элемент касается, подробный вид передается на контроллер навигации.
В этом подробном представлении элемент имеет изображение, которое сначала является изображением по умолчанию, и я хочу начать загрузку его изображения с URL-адреса.
Поэтому я создаю объект, который после инициализации отсоединяет новый поток, который, в свою очередь, загружает содержимое, а затем уведомляет мое мнение о том, что данные загружены:
// in MyLoader:
- (MyLoader *)initWithUrl:(NSURL *)url requester:(id)requester {
self.url = url;
self.requester = requester; // both are nonatomic, retain properties
[self performSelectorInBackground:@selector(loadIt) withObject:nil];
}
- (void)loadIt {
NSAutoreleasePool *arp = [[NSAutoreleasePool alloc] init];
NSData *data = [NSData dataWithContentsOfURL:url];
[requester performSelectorOnMainThread:@selector(dataReady) withObject:data waitUntilDone:YES;
[arp release];
}
// in MyRequester:
- (void)somewhere {
MyLoader *loader = [[[MyLoader] alloc] initWithUrl:someUrl requester:self] autorelease];
// then I retain loader somewhere, it's more complicated but I have verified that it's properly retained.
}
Несколько заметок:
Сначала я подумал, что может быть проблема с некоторыми переменными. Я ставлю точку останова прямо передperformSelectorOnMainThread
и подтвердил, чтоdata
а такжеrequester
оба были в порядке.
Затем я подумал, что это вызвано передачей NSData между потоками, поэтому я изменилwithObject:nil
, Это все еще падает.
Когда я продолжил расследование, крушение было очень странным. Я уточнилwaitUntilDone:YES
Я установил точку останова вrequester
«sdataReady
, НоperformSelectorOnMainThread
вызов возвращает (он достигает точки останова после него), не достигая точки останова внутриdataReady
, КСТАТИ,- (void)dataReady:(NSData*)
Тело пока содержит толькоint x = 1;
(чтобы установить точку останова). Кроме того, я попытался установитьwaitUntilDone:NO
все еще падает.
Селектор не выполняется (точка останова не достигнута), но сбой происходит вскоре после вызова.
У кого-нибудь есть идеи, что не так?
Это очевидно, но для ясности, если я просто закомментирую[requester performSelectorOnMainThread...
часть, это не терпит крах.
Кроме того, здесь есть трассировка стека, но она не помогает вообще.
#0 0x00a71004 in ___TERMINATING_DUE_TO_UNCAUGHT_EXCEPTION___ ()
#1 0x93436e3b in objc_exception_throw ()
#2 0x0028aca6 in __NSThreadPerformPerform ()
#3 0x00a098e1 in CFRunLoopRunSpecific ()
#4 0x00a08c48 in CFRunLoopRunInMode ()
#5 0x0005a78d in GSEventRunModal ()
#6 0x0005a852 in GSEventRun ()
#7 0x0168a003 in UIApplicationMain ()
#8 0x000028d4 in main (argc=1, argv=0xbffff100) at /Users/myName/Document/appName/main.m:14