Загрузить фотографии в фоновом режиме на iPad с помощью NSURLSession

Каков наилучший способ загрузки нескольких фотографий из библиотеки ресурсов с помощью 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]];
    }

}

Как и ожидалось, обновление прогресса совсем не правильное :)

Пожалуйста, укажите лучший подход, так как мне очень сложно найти подходящие учебники для обработки загрузок. Однако есть много объяснений фоновой загрузки.


person humblePilgrim    schedule 21.08.2014    source источник
comment
Вы хотите, чтобы индикатор выполнения отображал количество завершенных загрузок или, скорее, статус загрузки каждой отдельной задачи?   -  person dwlz    schedule 01.09.2014
comment
Я понял, как отслеживать загрузку каждого файла. Как я уже упоминал в своем ответе, сейчас я использую только индикатор активности. Конечно, лучшим сценарием было бы, если бы я мог показывать ход загрузки каждого файла. Кроме того, теперь я отправляю файлы один за другим (вместо использования цикла for, как в приведенном выше коде).   -  person humblePilgrim    schedule 01.09.2014


Ответы (1)


так как я не получил никакого ответа отсюда, я закончил тем, что полностью сбросил индикатор выполнения и добавил индикатор активности, который перестает вращаться после завершения всех загрузок.

person humblePilgrim    schedule 27.08.2014