Каков наилучший способ загрузки нескольких фотографий из библиотеки ресурсов с помощью NSURLSessionUploadTask?
Сейчас я использую фоновую загрузку NSURLSession. Вот код, который я использую:
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0]; //getting path of documents directory.
NSString *documentsPath = [documentsDirectory stringByAppendingPathComponent:@"tempFile.dat"]; //appending file name to documents path.
ALAssetsLibraryAssetForURLResultBlock resultblock = ^(ALAsset *myasset)
{
ALAssetRepresentation *rep = [myasset defaultRepresentation];
Byte *buffer = (Byte*)malloc(rep.size);
NSUInteger buffered = [rep getBytes:buffer fromOffset:0.0 length:rep.size error:nil];
NSData *data = [NSData dataWithBytesNoCopy:buffer length:buffered freeWhenDone:YES];
_totalBytesToSend += buffered;
[_dataArray addObject:data];
};
ALAssetsLibraryAccessFailureBlock failureblock = ^(NSError *myerror)
{
DLog(@"Can't get image - %@",[myerror localizedDescription]);
};
ALAssetsLibrary* assetslibrary = [[ALAssetsLibrary alloc] init];
//work needed here
for (NSURL *url in _urlArray) {
if(url != nil)
{
[assetslibrary assetForURL:url
resultBlock:resultblock
failureBlock:failureblock];
}
}
dispatch_async(dispatch_get_main_queue(), ^(void){
for (NSData *data in _dataArray) {
if(![data writeToFile:documentsPath atomically:YES])
{
DLog(@"Saving image failed");
}
//Prepare upload request
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:[NSURL URLWithString:@"my url here"]];
[request setCachePolicy:NSURLRequestReloadIgnoringLocalCacheData];
[request setHTTPMethod:@"POST"];
[request addValue:[[DTETokenManager sharedManager] loginToken] forHTTPHeaderField: @"X-CSRF-Token"];
_uploadTask = [_session uploadTaskWithRequest:request fromFile:[NSURL URLWithString:[NSString stringWithFormat:@"file://%@", documentsPath]]];
[_uploadTask resume];
}
});
Хороший ли это подход? Проблема, с которой я столкнулся, заключается в том, что я не могу правильно обновить индикатор выполнения, в котором я намереваюсь показать ход всего процесса загрузки. Я использую следующий код:
- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didSendBodyData:(int64_t)bytesSent totalBytesSent:(int64_t)totalBytesSent totalBytesExpectedToSend:(int64_t)totalBytesExpectedToSend
{
//Progress reportpo
_totalByteSent += totalBytesSent;
if(_totalBytesToSend && _totalByteSent)
{
[[NSNotificationCenter defaultCenter] postNotificationName:kBytesUploaded object:nil userInfo:[NSDictionary dictionaryWithObject:[NSNumber numberWithDouble:(double)totalBytesSent/(double)totalBytesExpectedToSend] forKey:NOTIFICATION_PAYLOAD]];
}
}
Как и ожидалось, обновление прогресса совсем не правильное :)
Пожалуйста, укажите лучший подход, так как мне очень сложно найти подходящие учебники для обработки загрузок. Однако есть много объяснений фоновой загрузки.