2014-01-15 9 views
6

Ich versuche, eine Liste von Fotoalben im Gerät verfügbaren the reference from here mit zu bekommen:ios - Einfaches Beispiel, um eine Liste von Fotoalben zu erhalten?

Bisher habe ich dies in meinem viewDidLoad:

// Get albums 
NSMutableArray *groups = [NSMutableArray new]; 
ALAssetsLibrary *library = [ALAssetsLibrary new]; 

ALAssetsLibraryGroupsEnumerationResultsBlock listGroupBlock = ^(ALAssetsGroup *group, BOOL *stop) { 
    if (group) { 
     [groups addObject:group]; 
    } 
}; 
NSUInteger groupTypes = ALAssetsGroupAlbum; 
[library enumerateGroupsWithTypes:groupTypes usingBlock:listGroupBlock failureBlock:nil]; 

NSLog(@"%@", groups); 

ist jedoch nichts an den Array-Gruppen hinzugefügt. Ich erwarte 2 Artikel aus dem NSLog.

Antwort

4

Es sieht aus wie die Antwort kommt in der asynchronen Antwort listGroupBlock, aber Ihr NSLog kommt direkt nach dem Anruf. Gruppen sind also immer noch leer und werden im aktuellen Thread noch nicht gefüllt.

Was ist mit dem Hinzufügen der Protokollierung in listGroupBlock?

ALAssetsLibraryGroupsEnumerationResultsBlock listGroupBlock = ^(ALAssetsGroup *group, BOOL *stop) { 
    if (group) { 
     [groups addObject:group]; 
    } 
    NSLog(@"%@", groups); 

    // Do any processing you would do here on groups 
    [self processGroups:groups]; 

    // Since this is a background process, you will need to update the UI too for example 
    [self.tableView reloadData]; 
}; 
+0

Anmelden des Blocks funktioniert. Ich schätze, das Problem ist das, was du gesagt hast. Aber wie kann ich sicherstellen, dass "Gruppen" vor der Iteration des Inhalts ausgefüllt werden? – resting

+0

Da listGroupBlock von einem Hintergrundthread aufgerufen wird (und nicht von dem Thread, auf dem Sie es erstellt haben), müssen Sie alle Bearbeitungen an Gruppen in 'listGroupBlock' vornehmen, genau dort, wo wir sie protokollieren. Dies bedeutet auch, dass Sie Ihre Benutzeroberfläche auch von 'listGroupBlock' aktualisieren müssen. Wenn Sie es beispielsweise in einer UITableView anzeigen, müssen Sie auch '[tableView reloadData]' in 'listGroupBlock' aufrufen. Sinn ergeben? – ansible

+0

Ok. Dieser Ansatz sollte auch in Ordnung sein. Vielen Dank. – resting

3

Für die IOS9-Version wurde die ALAsset-Bibliothek eingestellt. Stattdessen wurde das Photos Framework mit einem neuen Asset-Typ namens PHAsset eingeführt. Sie können Alben mithilfe der PHAssetCollection-Klasse abrufen.

PHFetchResult *userAlbums = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeAlbum subtype:PHAssetCollectionSubtypeAny options:nil]; 
PHFetchResult *smartAlbums = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeSmartAlbum subtype:PHAssetCollectionSubtypeAny options:nil]; 

PHAssetCollectionType definiert den Typ der Alben. Sie können die fetchResults wiederholen, um jedes Album zu erhalten.

[userAlbums enumerateObjectsUsingBlock:^(PHAssetCollection *collection, NSUInteger idx, BOOL *stop) {}]; 

Album im Fotorahmen wird durch PHAssetCollection dargestellt.