iOS dispatch_async и NSURLConnection делегируют функции, не вызываемые
Я думаю, я отредактировал этот пост, чтобы его было проще читать.
Мне нужно вызвать NSUrlConnection после того, как я закончил делать некоторые интенсивные манипуляции со строками в блоке dispatch_async.
На URL, который я вызываю, есть аутентификация.htaccess, поэтому я не могу использовать синхронное соединение.
Но методы делегата NSURLConnection не вызываются. Я знаю, что URL загружается через 5 секунд в браузере, и я протестировал код с простым URL без аутентификации, и это не имеет значения.
Что останавливает вызываемые методы делегата?
Эта функция выполняет некоторые манипуляции со строками и требует времени для завершения:
- (void)performSearch {
// set some defaults and work out if it is a valid search, setting bSearchOk
if (bSearchOk) {
// update some interface elements
self.msgBox.text = @"Translating...";
self.plateInput.enabled = NO;
self.searchProgress.hidden = NO;
dispatch_async( dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
// create a new search
Search *oPlateSearch = [[Search alloc] initWithTerm:thisTerm];
// ...
// perform search... this calls a variety of slow and intensive functions
// ...
self.aFinalPlates = [oPlateSearch.aValidated copy];
self.aCurrentPlates = [oPlateSearch.aFinals copy];
dispatch_async( dispatch_get_main_queue(), ^{
[oPlateSearch release];
// make ajax call to check if plates can be bought
[self getPrices];
});
});
} else {
// hide results
self.searchResults.hidden = YES;
}
}
И это тот, который вызывается в конце блока выше
/* call to get plate availability and prices */
-(void) getPrices {
// set return message
self.msgBox.text = @"Getting prices and availability";
// ...
// then I build my strRequest var, which is a valid working URL
// ...
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:strRequest]];
NSURLConnection *loginConnection = [[[NSURLConnection alloc] initWithRequest:request delegate:self] autorelease];
NSLog('This will get logged');
if(loginConnection) {
NSLog('This will also get logged');
self.jsonSearchResponse = [[[NSMutableData data] retain] autorelease];
NSLog('And this will get logged, so it's not throwing errors');
} else {
NSLog(@"Failed to get search results");
}
}
Обновление: я попробовал это также, поскольку это было принято в ответе на другой подобный вопрос, но это не сработало:
NSURLConnection *loginConnection = [[NSURLConnection alloc] initWithRequest:request delegate:self startImmediately:NO];
[loginConnection scheduleInRunLoop:[NSRunLoop mainRunLoop] forMode:NSRunLoopCommonModes];
[loginConnection start];
Основываясь на этом вопросе: почему методы делегата NSURLConnection не вызываются при использовании глобальной очереди отправки?
3 ответа
Кто-то из форума iphonedevsdk.com ответил мне на это:
http://www.iphonedevsdk.com/forum/iphone-sdk-development/97415-dispatch_async-nsurlconnection.html
Ответ должен был использовать:
[self performSelectorOnMainThread:@selector(getPrices) withObject:Nil waitUntilDone:NO];
Я начал SO сообщение, которое показывает, как использовать NSURLConnection
с dispatch_async
и настроить NSRunLoop
NSURLConnection блокирующая оболочка реализована с семафорами
Кусок кода, который вас заинтересует:
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
NSURLRequest* request = [NSURLRequest requestWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:10];
[NSURLConnection connectionWithRequest:request delegate:self];
while(!self.finished) {
[[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]];
}
});
и в connectionDidFinishLoading
, задавать finished
ДА:
- (void)connectionDidFinishLoading:(NSURLConnection *)connection {
self.finish = YES;
}
Я думаю, что вы автоматически освобождаете соединение и не сохраняете никаких ссылок на него, так что оно выходит из памяти. Удалите автосервисный вызов и посмотрите, исчезнет ли проблема. Если это произойдет, просто найдите способ освободить соединение, когда вы закончите с ним, чтобы оно не протекало.