Ich integriere Autocomplete über Google Places API in eine Suchleiste. Und für die Netzwerkanforderungen verwende ich AFNetworking.Warum abgebrochen AFHTTPRequestOperation manchmal den Erfolgsblock getroffen?
Ich möchte nur eine Anfrage gleichzeitig ausführen lassen. Also jedes Mal tippe ich einen neuen Brief, ich folgendes:
1 - Abbrechen des vorherigen AFHTTPRequestOperation:
[self.currentGlobalSearchListRequest cancel];
NSLog(@"%@ cancelled", self.currentGlobalSearchListRequest);
2 - Starten Sie ein neues AFHTTPRequestOperation:
self.currentGlobalSearchListRequest = [searchService getGlobalSearchListItemsForString:searchString inRegion:region delegate:self];
NSLog(@"%@ started", self.currentGlobalSearchListRequest);
Hier ist der Rückruf aufgerufen wenn die Anfrage beendet ist:
- (void)request:(PointSearchRequest *)request didLoadSearchListItems:(NSArray *)searchListItems {
NSAssert(request == self.currentGlobalSearchListRequest, @"!!!callback from a request that should be cancelled!!!");
[self.delegate searchListLoader:self didLoadGlobalSearchList:searchListItems];
}
Manchmal traf ich die Behauptung Ich habe also ein wenig untersucht und festgestellt, dass der Fehlerblock mit einem Fehlercode NSURLErrorCancelled
aufgerufen wird, was das erwartete Verhalten ist, aber manchmal wird der Erfolgsblock aufgerufen!
Dieser Stack-Trace sagt mir, dass die Dinge in meinem Code in der richtigen Reihenfolge aufgetreten
2013-12-22 09:38:46.484 Point[63595:a0b] <PointSearchRequest: 0x18202b50> started
2013-12-22 09:38:46.486 Point[63595:a0b] <PointSearchRequest: 0x18202b50> cancelled
2013-12-22 09:38:46.487 Point[63595:a0b] <PointSearchRequest: 0x181a5dd0> started
2013-12-22 09:38:46.496 Point[63595:a0b] *** Assertion failure in -[SearchListLoader request:didLoadSearchListItems:], /Users/aurelienporte/Documents/Developpement/Perso/iOS/Point/Point/Classes/Models/SearchListLoader.m:82
(lldb) po request
<PointSearchRequest: 0x18202b50>
Plus schaute ich auf die Eigenschaft isCancelled
auf AFHTTPRequestOperation, wenn der Erfolg Block genannt wird, aber es gibt mir NEIN (!!!) Ich weiß, ich könnte am Ende nur testen statt mit NSAssert, aber möchte den Ursprung des Problems finden.
Sind Sie schon einmal auf ähnliche Probleme gestoßen, bei denen Abbrechen die Anfrage nicht abbricht? Und dann wird der Erfolgsblock anstelle des Fehlerblocks aufgerufen? Ist dies ein Problem, das dem AFNetworking-Team gemeldet werden muss? Danke!
Wenn es helfen kann, die Anforderungen schnell flippen (Google Autocomplete aPI beeindruckend ...)
Ich würde dies erwarten. Das Abbrechen einer abgeschlossenen Operation, die ihren Beendigungshandler nicht ausgelöst hat, ist mehrdeutig; es könnte entweder den Beendigungshandler auslösen oder den Abbruch akzeptieren. Ich würde nicht darauf zählen, dass es zu 100% passiert. –