J'utilise la bibliothèque AFNetworking. Je n'arrive pas à comprendre comment télécharger un fichier et l'enregistrer dans le répertoire des documents.
Réponses
Trop de publicités?AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
manager.responseSerializer = [AFCompoundResponseSerializer serializer];
manager.responseSerializer.acceptableContentTypes = [NSSet setWithObject:@"application/octet-stream"];
AFHTTPRequestOperation *operation = [manager GET:url parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) {
if (responseObject) {
// your code here
} else {
// your code here
}
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
}];
[operation start];
// manager.responseSerializer.acceptableContentTypes = [NSSet setWithObject : @ "application/octet-stream"] ; peut varier en fonction de ce que vous attendez.
Oui, il est préférable d'utiliser AFNetworking 2.0
avec AFHTTPRequestOperationManager
. Avec l'ancienne méthode, mon fichier a été téléchargé mais pour une raison quelconque, il n'a pas été mis à jour dans le système de fichiers.
Ajouté à swilliam's réponse, pour montrer la progression du téléchargement, en AFNetworking 2.0
vous faites de même - il suffit de définir le bloc de progression du téléchargement après avoir défini le flux de sortie.
__weak SettingsTableViewController *weakSelf = self;
operation.outputStream = [NSOutputStream outputStreamToFileAtPath:newFilePath append:NO];
[operation setDownloadProgressBlock:^(NSUInteger bytesWritten, long long totalBytesWritten, long long totalBytesExpectedToRead) {
float progress = totalBytesWritten / (float)totalBytesExpectedToRead;
NSString *progressMessage = [NSString stringWithFormat:@"%@ \n %.2f %% \n %@ / %@", @"Downloading ...", progress * 100, [weakSelf fileSizeStringWithSize:totalBytesWritten], [weakSelf fileSizeStringWithSize:totalBytesExpectedToRead]];
[SVProgressHUD showProgress:progress status:progressMessage];
}];
C'est ma méthode pour créer une chaîne d'octets :
- (NSString *)fileSizeStringWithSize:(long long)size
{
NSString *sizeString;
CGFloat f;
if (size < 1024) {
sizeString = [NSString stringWithFormat:@"%d %@", (int)size, @"bytes"];
}
else if ((size >= 1024)&&(size < (1024*1024))) {
f = size / 1024.0f;
sizeString = [NSString stringWithFormat:@"%.0f %@", f, @"Kb"];
}
else if (size >= (1024*1024)) {
f = size / (1024.0f*1024.0f);
sizeString = [NSString stringWithFormat:@"%.0f %@", f, @"Mb"];
}
return sizeString;
}
En plus des réponses précédentes, avec AFNetworking 2.5.0 et iOS7/8, j'ai constaté que l'étape supplémentaire d'ouverture du flux de sortie est également nécessaire pour empêcher l'application de se bloquer (et finalement de se planter par manque de mémoire).
operation.outputStream = [NSOutputStream outputStreamToFileAtPath:dest
append:NO];
[operation.outputStream open];
[operation start];
- Réponses précédentes
- Plus de réponses