NSURLConnection delegation und threading - iPhone
Habe ich eine Klasse, die updates der beiden .plist-Dateien in den app-documents-Verzeichnis über eine NSURLConnection. Die Klasse agiert als Ihre eigenen Delegierten für NSURLConnection. Es funktioniert einwandfrei, wenn ich Frage für eine einzelne Datei, aber nicht, wenn ich versuche zu aktualisieren, werden zwei Dateien. Sieht es aus, sollte ich einen neuen thread starten für jeden der getNewDatabase Nachrichten?
- (void)getAllNewDatabases {
[self performSelectorOnMainThread:@selector(getNewDatabase:) withObject:@"file1" waitUntilDone:YES];
[self performSelectorOnMainThread:@selector(getNewDatabase:) withObject:@"file2" waitUntilDone:YES];
}
- (BOOL)getNewDatabase:(NSString *)dbName
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
NSMutableString *apiString = [[NSMutableString alloc] initWithString:kAPIHost];
[apiString appendFormat:@"/%@.plist",dbName];
NSURLRequest *myRequest = [NSURLRequest requestWithURL:[NSURL URLWithString:apiString] cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:60.0];
NSURLConnection *myConnection = [[NSURLConnection alloc] initWithRequest:myRequest delegate:self];
[apiString release];
if( myConnection )
{
//omitted for clarity here
}
[pool release];
}
//NSURLConnection delegate methods here ...
InformationsquelleAutor FluffulousChimp | 2009-08-01
Du musst angemeldet sein, um einen Kommentar abzugeben.
Fand ich etwas Interessantes mit NSURLConnection und NSThread - der thread lebt nur so lange, wie es braucht, um führen Sie die Methode, die Sie aufrufen.
Im obigen Fall wird der thread Leben nur so lange, wie
getNewDatabase:(NSString *)dbName
in Anspruch nimmt, daher ist das töten von jedem der Delegierten Methoden auf, bevor Sie wirklich Zeit haben, etwas zu tun.Fand ich diese website, die eine bessere Erklärung und eine Lösung für das problem
Ich Zwickte es ein wenig, so konnte ich ein benutzerdefiniertes time-out, wenn es nicht abgeschlossen in einem bestimmten Zeitraum (praktisch, wenn Sie jemand zu Fuß rund um zwischen den access points)
InformationsquelleAutor James Raybould
Wie es derzeit steht in dem code, den Sie zur Verfügung gestellt,
getNewDatabase:
läuft auf dem main thread der Anwendung. Das problem in diesem speziellen Fall ist, dann ist etwas anderes als der Lebenszyklus der thread, wie James beobachtet, in seinem Fall.Wenn Sie nicht beabsichtigen, führen Sie diesen Vorgang im hintergrund, würde ich empfehlen, sich in
NSOperationQueue
undNSOperation
sondern als Lösung, das problem mit dem aktuellen code. Ich denke, dein Fall ist ein großer fit fürNSOperationQueue
- insbesondere angesichts der Tatsache, dass Sie mehr als eine download-Aufgabe zu erfüllen.Dave Dribin hat eine exzellente Artikel über die Verwendung von asynchronen API, wie die NSURLConnection in
NSOperation
. Alternativ, solange Sie laufen in einem hintergrund-thread aus, Sie können auch den Prozess vereinfachen und nur die Verwendung eines synchronen API-Methode stattdessen in Ihrer NSOperation, wieinitWithContentsOfURL:
.Marcus Zarra hat auch geschrieben ein tutorial, der zeigt, wie einfach es ist, integrieren Sie und verwenden Sie NSOperationQueue für die einfache hintergrund-Operationen.
InformationsquelleAutor Sean Murphy