Frage

Ich habe gerade angefangen, AFNetworking zu verwenden, und bisher hat es gut funktioniert, nur um Daten aus dem Web abzurufen.

Aber jetzt habe ich eine Liste von Dateien, die auf das Gerät heruntergeladen werden müssen

for(NSDictionary *issueDic in data)
{
    Issue *issue = [[Issue alloc] init];
    ...
    [self getOrDownloadCover:issue];
    ...
}

getOrDownloadCover: Problem überprüft, ob eine Datei bereits lokal vorhanden ist. Wenn dies der Fall ist, wird nur dieser Pfad gespeichert. Wenn dies nicht der Fall ist, wird die Datei von einer bestimmten URL heruntergeladen

- (void)getOrDownloadCover:(Issue *)issue
{
    NSLog(@"issue.thumb: %@", issue.thumb);

    NSString *coverName = [issue.thumb lastPathComponent];

    NSLog(@"coverName: %@", coverName);

    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    __block NSString *filePath = [documentsDirectory stringByAppendingPathComponent:coverName];

    if([[NSFileManager defaultManager] fileExistsAtPath:filePath])
    {
        // Cover already exists
        issue.thumb_location = filePath;

        NSLog(@"issue.thumb_location: %@", filePath);
    }
    else 
    {
        NSLog(@"load thumb");

        // Download the cover
        NSURL *url = [NSURL URLWithString:issue.thumb];
        AFHTTPClient *httpClient = [[[AFHTTPClient alloc] initWithBaseURL:url] autorelease];
        NSMutableURLRequest *request = [httpClient requestWithMethod:@"GET" path:issue.thumb parameters:nil];

        AFHTTPRequestOperation *operation = [[[AFHTTPRequestOperation alloc] initWithRequest:request] autorelease];
        operation.outputStream = [NSOutputStream outputStreamToFileAtPath:filePath append:NO];

        [operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {
        issue.thumb_location = filePath;

        NSLog(@"issue.thumb_location: %@", filePath);
    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
        NSLog(@"FAILED");
    }];
        [operation start];
    }
}

getOrDownloadCover: Das Problem kann 20 Mal hintereinander aufgerufen werden, daher müsste ich alle meine Anfragen in eine Warteschlange stellen, und sobald die Warteschlange abgeschlossen ist, sollte es immer noch möglich sein, den Pfad zu speichern (oder einfach eine Benachrichtigung zu senden, da ich bereits weiß, was der Pfad ist)

Irgendwelche Vorschläge dafür?

War es hilfreich?

Lösung

Fügen Sie eine hinzu NSOperationQueue zu einem Objekt können Sie die Instanz von an jedem beliebigen Punkt in Ihrer Anwendung abrufen, z. B. in Ihrem AppDelegate .Dann fügen Sie einfach die AFHTTPRequestOperation zu dieser Warteschlange wie:

[[(AppDelegate *) [UIApplication sharedApplication].delegate operartionQueue] addOperation:operation];

Behandeln Sie einfach das Speichern im Abschlussblock, rufen Sie entweder eine Methode aus diesem Block im Hauptthread auf oder posten Sie eine NSNotification.

Um den Hauptthread aufzurufen, verwenden Sie GCD :

dispatch_async(dispatch_get_main_queue(), ^{
    // Call any method from on the instance that created the operation here.
    [self updateGUI]; // example
});

Andere Tipps

nicht sicher, ob das hilfreich ist, aber ...

Anstatt Ihre eigene OperationQueue zu verwenden, können Sie die Operation von AfhttpClient verwenden.ENQUEUE SINGLICHE OPERNUNGEN MIT ENQUEHTPOPERATION OPERUE ODER BESTELLEN EINES ANGEBOTS ABGABEN mit ENQUEUEBATCHOPERATIONEN (erinnere mich an diese Methodennamen aus dem Speicher, wahrscheinlich von einem kleinen).

Soweit sich Daten speichert, die für jeden Vorgang spezifisch gespeichert sind, können Sie AFHTTPREQUESTOPERATERATION SUBLASS SUBLASS SUBLASSEN UND SETTIFIZIERUNGEN FÜR DEN PFAD, DER SIE SPORESTEN.Etwas wie das.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top