2011-11-04 6 views
16

Mężczyzna, zakłopotany tym. Próbuję pobrać plik z numerem AFNetworking, a najlepsze, co mogę zrobić, to przechwycić bajty postępu w downloadProgressBlock. Wypróbowałem wiele różnych rozwidleń AFNetworking i teraz wracam do najnowszej wersji. Wygląda na to, że w tym samym czasie zmodyfikowano funkcję AFHTTPRequestOperation, aby uwzględnić także NSURLResponse, ale nie ma jej w najnowszej wersji. I, zgodnie z poniższym kodem, blok "sukcesu" nigdy nie jest wywoływany. Otrzymuję dziennik pobranych bajtów, a następnie wywoływana jest funkcja^complete. sukces i błąd nigdy nie są wywoływane.AFNetworking - Używanie AFHTTPRequestOperation do pobrania pliku?

Wszelkie wskazówki na ten temat będą niesamowite. Nie mogę dowiedzieć się, gdzie dane są zwracane i jak uzyskać go używać NSFileManager na nim? Muszę pobierać pliki, nie zapisywać strumieni obrazów itp.

Edytuj: Próbowałem też przechwytywać dane przez przesłonięcie - (void) connection: didReceiveData zgodnie z sugestią w dokumentacji, ale nic tam nie robię.

// url jest http://mydomain.com/somezip.zip

NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:[NSString stringWithFormat:@"%@", url]]]; 

AFHTTPRequestOperation *operation = [AFHTTPRequestOperation HTTPRequestOperationWithRequest:request success:^(id object) { 

    NSLog(@"hey, some success!"); 

} failure:^(NSHTTPURLResponse *response, NSError *error) { 

    NSLog(@"%@", error); 

}]; 


[operation setDownloadProgressBlock:^(NSInteger bytesRead, NSInteger totalBytesRead, NSInteger totalBytesExpectedToRead) { 

    // callback is sent in and works great. Just outputting to the console at the moment 
    SEL callme = NSSelectorFromString(callback); 
    [sender performSelectorOnMainThread:callme withObject:[NSNumber numberWithInt:bytesRead] waitUntilDone:NO]; 

}]; 

[operation setCompletionBlock:^{ 
    NSLog(@"operation complete"); 
}]; 

NSOperationQueue *queue = [[[NSOperationQueue alloc] init] autorelease]; 
[queue addOperation:operation]; 

Odpowiedz

64

można po prostu skorzystać z tej funkcji, która znajduje się na AFNetworking a nawet zapisać go na dysku - zauważy operation.outputStream:

NSMutableURLRequest* rq = [api requestWithMethod:@"GET" path:@"YOUR/URL/TO/FILE" parameters:nil]; 
AFHTTPRequestOperation *operation = [[[AFHTTPRequestOperation alloc] initWithRequest:rq] autorelease]; 

NSString* path=[@"/PATH/TO/APP" stringByAppendingPathComponent: imageNameToDisk]; 
operation.outputStream = [NSOutputStream outputStreamToFileAtPath:path append:NO]; 

[operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) { 

    NSLog(@"SUCCCESSFULL IMG RETRIEVE to %@!",path) 

} failure:^(AFHTTPRequestOperation *operation, NSError *error) { 

    // Deal with failure 
}]; 

EDIT: missed

[operation start]; 

EDIT: ...or if you use an AFHTTPClient * apiClient :

// [apiClient enqueueHTTPRequestOperation:operation]; 
+3

Ktoś dać temu człowiekowi o upvote! OP powinien wybrać odpowiedź! – radj