iOS dispatch_async und NSURLConnection Delegierten Funktionen nicht aufgerufen
Habe ich bearbeitet diese post, um es einfacher zu Lesen, denke ich.
Muss ich anrufen eine NSUrlConnection, nachdem ich beendet habe, mache ein paar intensive string-manipulation in einem dispatch_async block.
Die URL, die ich aufrufen hat .htaccess-Authentifizierung, so dass ich nicht verwenden können, eine synchrone Verbindung.
Aber die NSURLConnection delegate-Methoden werden nicht aufgerufen. Ich weiß, die URL wird geladen, nach etwa 5 Sekunden in den browser, und getestet hab ich den code mit einem einfachen URL ohne Authentifizierung und es macht keinen Unterschied.
Was hält die delegate-Methoden aufgerufen wird?
Diese Funktion hat einige string-Manipulations-Zeug, und es dauert eine Weile bis Ende:
- (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;
}
}
Ist und rief gegen Ende der block oben
/* 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");
}
}
Update: ich habe versucht, dies so gut, wie es war eine akzeptierte Antwort auf eine ähnliche Frage, aber es hat nicht funktioniert:
NSURLConnection *loginConnection = [[NSURLConnection alloc] initWithRequest:request delegate:self startImmediately:NO];
[loginConnection scheduleInRunLoop:[NSRunLoop mainRunLoop] forMode:NSRunLoopCommonModes];
[loginConnection start];
Basierend auf dieser Frage: Warum NSURLConnection delegate-Methoden nicht aufgerufen werden, wenn mit dem global dispatch-queue?
InformationsquelleAutor Pete | 2012-01-20
Du musst angemeldet sein, um einen Kommentar abzugeben.
Jemand aus iphonedevsdk.com forum beantwortet dies für mich:
http://www.iphonedevsdk.com/forum/iphone-sdk-development/97415-dispatch_async-nsurlconnection.html
Die Antwort war:
Ich bin mir nicht ganz sicher, aber die Beurteilung durch den Namen der Funktion "performSelectorOnMainThread", wenn ich den thread trigger beendet wird, ruft es eine Methode auf das Hauptprogramm-thread.
Könnte es sein, dass Sie wirklich nicht das problem lösen, weil Ihre Berufung getPrices auf dem Haupt-thread und jetzt nicht auf die Globale dispatch-Warteschlange, wie Sie ursprünglich gewünscht?
InformationsquelleAutor Pete
Ich habe angefangen, SO ein Beitrag, der zeigt, wie der
NSURLConnection
mitdispatch_async
und konfigurieren Sie dieNSRunLoop
NSURLConnection Sperrung wrapper realisiert mit Semaphore
Das Stück code, dass Sie interessiert wäre, ist:
und in der
connectionDidFinishLoading
legenfinished
JA:InformationsquelleAutor quentinadam
Ich glaube, du bist autoreleasing die Verbindung und halten nicht alle Verweise auf ihn, so dass es geht aus der Erinnerung. Entfernen Sie die autorelease aufrufen und sehen, ob das problem verschwindet. Wenn Sie es tut, Sie nur einen Weg finden, um die Verbindung zu lösen, wenn Sie fertig sind mit es, so dass es nicht Leck.
InformationsquelleAutor zoul