Как получить все фотографии моментально, используя ALAssetLibrary в ios7?

У меня проблема с получением фотографий в момент, как у Apple iPhone в ios8. Я реализовал для ios8, используя PHAsset и Photos.framework. Теперь, когда я запускаю тот же код на устройстве ios7, он ничего не возвращает. Итак, я иду с ALAssetLibrary, чтобы получить фотографии. Используя ALAssetLibrary, я также получил все фотографии, но они похожи на альбомы. а также с помощью этой библиотеки ALAssetLibrary я не могу получить дату создания альбома, а не его название местоположения, так как я должен показать это для данных в заголовке каждого раздела.

Мой код для получения фотографий в ios7 с помощью ALAssetLibrary:

        _imagearray = [@[] mutableCopy];
        __block NSMutableArray *tmpAssets = [@[] mutableCopy];

        ALAssetsLibrary *assetLibrary = [[ALAssetsLibrary alloc] init];
        [assetLibrary enumerateGroupsWithTypes:ALAssetsGroupAll usingBlock:^(ALAssetsGroup *group, BOOL *stop)
         {
             if (group)
             {
                 [group setAssetsFilter:[ALAssetsFilter allAssets]];
                 [group enumerateAssetsWithOptions:NSEnumerationReverse usingBlock:^(ALAsset *asset, NSUInteger index, BOOL *stop) {
                     if (asset!=nil)
                     {
                         [tmpAssets addObject:asset];

                     }
                 }];
             }
             self.imagearray = tmpAssets;
             NSLog (@“%@“,self.imagearray);
         }
                                  failureBlock:^(NSError *error)
         {
             NSLog(@"error enumerating AssetLibrary groups %@\n", error);
         }];

person Pratik Patel    schedule 09.01.2015    source источник


Ответы (2)


Вам не повезло с iOS 7. AssetsLibrary, как вы заметили, возвращает только альбомы (Camera Roll, пользовательские альбомы). Несмотря на то, что приложение «Фотографии» в iOS 7 показывает моменты, в iOS 7 нет API-интерфейсов разработчиков для получения моментов.

person holtmann    schedule 13.02.2015
comment
Да, это правда, и я также справился с этим в iOS8, но в iOS 7 я не нашел для этого решения. - person Pratik Patel; 16.02.2015
comment
Единственное, что вы могли бы сделать: отсканировать всю библиотеку фотографий самостоятельно, а затем создать структуру, подобную моментам (либо в памяти, либо в структуре данных/базе данных на диске). Однако это будет довольно медленно, если у пользователя много фотографий. Кроме того, вам нужно каждый раз пересканировать всю библиотеку, так как у AssetsLibrary нет методов узнать, какие ресурсы были добавлены или удалены, когда приложение не запущено. - person holtmann; 17.02.2015

Я сам нашел ее решения.

+ (ALAssetsLibrary *)defaultAssetsLibrary {
    static dispatch_once_t pred = 0;
    static ALAssetsLibrary *library = nil;
    dispatch_once(&pred, ^{
        library = [[ALAssetsLibrary alloc] init];
    });
    return library;
}

-(void)loadAssets{
    NSMutableArray *unSortArray = [[NSMutableArray alloc] init];
    ALAssetsLibrary *library = [MomentsVCTR defaultAssetsLibrary];
    [library enumerateGroupsWithTypes:ALAssetsGroupAll usingBlock:^(ALAssetsGroup *group, BOOL *stop) {
        if (group == nil) {
            NSLog(@"Done!");
            [self manageLocalAssets:unSortArray];
        }
        [group setAssetsFilter:[ALAssetsFilter allAssets]];
        [group enumerateAssetsWithOptions:NSEnumerationReverse usingBlock:^(ALAsset *alAsset, NSUInteger index, BOOL *innerStop) {
            if (alAsset) {
                [unSortArray addObject:alAsset];
            }

        }];
    } failureBlock: ^(NSError *error) {
        NSLog(@"No groups: %@",error);
    }];
}

-(void)manageLocalAssets:(NSMutableArray*)unSortArray{
    NSMutableArray *_resultArray = [[NSMutableArray alloc] init];
    NSDateFormatter *df = [[NSDateFormatter alloc] init];
    [df setDateFormat:@"dd-MMM-yyyy"];
    NSLog(@"in loadassets");
    NSSortDescriptor *descriptor=[[NSSortDescriptor alloc] initWithKey:@"date" ascending:NO];
    NSArray *descriptors=[NSArray arrayWithObject: descriptor];
    NSArray *reverseOrder=[unSortArray sortedArrayUsingDescriptors:descriptors];

    for (int k=0; k<reverseOrder.count; k++) {
        ALAsset *asset = (ALAsset *)[reverseOrder objectAtIndex:k];
        NSString *dateStr = [df stringFromDate:[asset valueForProperty:ALAssetPropertyDate]];
        if (![self.arrDate containsObject:dateStr]) {
            [self.arrDate addObject:dateStr];
            [self.arrEventID addObject:@"0"];
            [self.arrEventName addObject:@"0"];
        }
        [_resultArray addObject:asset];
    }
    for (int i=0;i<self.arrDate.count;i++) {
        NSMutableArray *arr = [[NSMutableArray alloc] init];
        NSMutableArray *arr2 = [[NSMutableArray alloc] init];
        int tPhoto = 0;
        int tVideo = 0;
        for (int j=0; j<_resultArray.count; j++) {
            ALAsset *asset = (ALAsset*)[_resultArray objectAtIndex:j];
            NSString *dateStr = [df stringFromDate:[asset valueForProperty:ALAssetPropertyDate]];
            if ([[self.arrDate objectAtIndex:i] isEqualToString:dateStr]) {
                UIImage *latestPhotoThumbnail = [UIImage imageWithCGImage:[asset thumbnail]];
                [arr addObject:latestPhotoThumbnail];
                latestPhotoThumbnail = nil;
                if ([[asset valueForProperty:ALAssetPropertyType] isEqualToString:ALAssetTypeVideo]) {
                    [arr2 addObject:@"1"];
                    tVideo++;
                }
                else{
                    [arr2 addObject:@"0"];
                    tPhoto++;
                }
                NSDate *date = [asset valueForProperty:ALAssetPropertyDate];
                NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
                [dateFormatter setLocale:[NSLocale currentLocale]];
                [dateFormatter setDateFormat:@"dd-MMM-yyyy"];
                [self.imageDateArray addObject:[dateFormatter stringFromDate:date]];
                [self.imageIdArray addObject:[NSString stringWithFormat:@"%d",i]];
            }
        }
        [self.imagearray addObject:arr];
        [self.arrContentType addObject:arr2];

        [self.momentArray addObject:[NSString stringWithFormat:@"%lu",(unsigned long)arr.count]];
        [self.arrPhotoCount addObject:[NSString stringWithFormat:@"%d",tPhoto]];
        [self.arrVideoCount addObject:[NSString stringWithFormat:@"%d",tVideo]];
    }
    [self setButtonsSize];
    self.collection.dataSource = self;
    self.collection.delegate = self;
    [self.collection reloadData];
    [self.collection.collectionViewLayout invalidateLayout];
    self.footerView.hidden = TRUE;
    self.footerWebView.hidden = TRUE;

}
person Pratik Patel    schedule 21.02.2015