2015-09-03 3 views
2

У меня есть метод, который извлекает информацию о PHAsset, и он работает, но когда дело доходит до чтения информации сотен активов, это может быть довольно медленным.Получить информацию о PHAsset быстро?

Каков наилучший способ прочитать информацию об объекте, таком как файлы и метаданные?

Мой текущий код:

- (void) getAssetInfo: (NSUInteger*) assetIndex { 
    NSNumber *_assetIndex = [NSNumber numberWithUnsignedInteger: assetIndex]; 

    PHFetchOptions *fetchOptions; 
    fetchOptions.sortDescriptors = @[ [NSSortDescriptor sortDescriptorWithKey:@"creationDate" ascending:YES], ]; 
    PHFetchResult *fetchResult = [PHAsset fetchAssetsWithOptions:fetchOptions]; 

    PHAsset *asset = [fetchResult objectAtIndex: assetIndex]; 

    PHImageManager *imageManager = [PHImageManager defaultManager]; 
    PHImageRequestOptions *options = [[PHImageRequestOptions alloc]init]; 
    options.synchronous = YES; 
    options.version = PHImageRequestOptionsVersionCurrent; 


    [asset requestContentEditingInputWithOptions:options 
           completionHandler:^(PHContentEditingInput *contentEditingInput, NSDictionary *info) { 

            NSString *fileInfo; 

            NSString *assetURL = nil; 

            if (contentEditingInput.avAsset != nil){ 

             AVURLAsset *avurlasset_ = (AVURLAsset*) contentEditingInput.avAsset; 
             assetURL = [avurlasset_.URL absoluteString]; 

            } else { 
             assetURL = [contentEditingInput.fullSizeImageURL absoluteString]; 
            } 

            if (assetURL != nil){ 
             uint64_t fileSize; 

             NSString *filePathFull = [assetURL substringWithRange: NSMakeRange(7, [assetURL length] - 7)]; 

             NSFileManager * filemanager = [[NSFileManager alloc]init]; 
             if([filemanager fileExistsAtPath:filePathFull]){ 
              fileSize = [[filemanager attributesOfItemAtPath:filePathFull error:nil] fileSize]; 
             } 


             NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; 
             [dateFormatter setDateFormat:@"yyyy,MM,dd,HH,mm,ss"]; 

             NSArray *assembled_FI = [NSArray arrayWithObjects: 
                   (NSNumber*) _assetIndex, 
                   assetURL, 
                   assetURL.lastPathComponent, 
                   (NSNumber*)[NSNumber numberWithUnsignedLongLong: fileSize], 
                   (NSString*) [dateFormatter stringFromDate:asset.creationDate], 
                   nil]; 
           } 
           }]; 
} 

ответ

0

Существует небольшая библиотека для Swift 3 недавно добавленные в GitHub называется AssetManager.

Это упрощает доступ к активам и позволяет очень быстро извлекать данные.

Ссылка на AssetManager можно найти здесь: https://github.com/aidv/AssetManager

Смежные вопросы