2013-06-08 9 views
10

Próbuję uzyskać wszystkie obrazy, które są w photos.app i wyświetlić je w UICollectionView. Mam ten kod, aby pobrać obrazy:ALAssetPrivate po życiu jego właścicielem ALAssetsLibrary

ALAssetsLibrary *al = [ViewController defaultAssetsLibrary]; 

ALAssetsGroupEnumerationResultsBlock groupEnumerAtion = ^(ALAsset *result, NSUInteger index, BOOL *stop){ 

    if (result!=NULL) { 

     if ([[result valueForProperty:ALAssetPropertyType] isEqualToString:ALAssetTypePhoto]) { 

      [imagesGotFromUserLibrary addObject:result]; 
     } 

    } 
}; 

ALAssetsLibraryGroupsEnumerationResultsBlock 
libraryGroupsEnumeration = ^(ALAssetsGroup* group, BOOL* stop){ 
    [group setAssetsFilter:[ALAssetsFilter allPhotos]]; 

    if (group!=nil) 
    { 

     [group enumerateAssetsUsingBlock:groupEnumerAtion]; 
    } 
    else 
    { 

     dispatch_async(dispatch_get_global_queue(0, 0), ^{ 
      GalleryCollectionViewController *otherController = [[GalleryCollectionViewController alloc] init]; 
      [otherController receiveImagesWithMutableArray:imagesGotFromUserLibrary]; 

     }); 
    } 

}; 



al = [[ALAssetsLibrary alloc] init]; 
[al enumerateGroupsWithTypes:ALAssetsGroupSavedPhotos 
         usingBlock:libraryGroupsEnumeration 
        failureBlock:^(NSError *error){ 
         NSLog(@"ERROR: %@", error); 
        }]; 

leży to w viewDidLoad a następnie:

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

Ten fragment kodu jest wysłanie tablicę do innego kontrolera, który będzie ustawić obrazy do mojego UICollectionView . Problem polega na tym, że otrzymuję komunikat o błędzie "Nieprawidłowa próba dostępu przez czas życia jego biblioteki ALAssetsLibrary" i jeśli spróbuję NSLog mojej tablicy wynik jest taki jak "ALAsset - Type: Unknown, URLs: (null)".

Sprawdziłem w Internecie i znalazłem rozwiązanie. Powinienem dodać ten wiersz kodu, ale to nie działa. Kod jest:

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

ktoś jest w stanie mi pomóc w uzyskaniu poprawnych zdjęć URL do wyświetlenia?

+0

(ALAssetsLibrary *) defaultAssetsLibrary metoda charme dla mnie! – kb920

Odpowiedz

15

Rozwiązaniem jest zawsze używać tej samej biblioteki dla wszystkich wejść do zasobów we wszystkich klasach. Podane powyżej pojedyncze rozwiązanie jest dobre - o ile wszystkie klasy wywołują defaultAssetsLibrary i żadne z nich nie przydziela/nie inicjuje własnego ALAssetsLibrary.

+0

Dzięki, ale to niestety mi nie pomogło. Przekazuję tablicę tylko do innej klasy. Mam dostęp do ALAssets Library tylko raz i nie mogę zrozumieć, co jest nie tak. Nie sądzę, że tworzę inną instancję, ale może się mylę. Czy możesz dokładnie sprawdzić mój kod? :) – BalestraPatrick

+2

Musisz przenieść metodę defaultAssetsLibrary gdzieś tak, aby biblioteka nie została zniszczona. Delegat aplikacji lub pierwszy kontroler widoku (jeśli popycha drugi kontroler widoku, który wybiera zasoby i odsyła je do pierwszego). – Wain

1

Mam ten sam problem. I w końcu to rozwiązałem.

To jest mój stan: mam dwóch kontrolerów, pierwszy do drugiego. W pierwszym z nich, że zainicjowana biblioteki przy użyciu następującego kodu:

let library = ALAssetsLibrary() 

i umieścić wszystkie informacje o grupie na tablicy, tak, że można używać ich do drugiego kontrolera widoku. Ale może to doprowadzić do braku zdjęcia w grupie.

i komunikat o błędzie jest taki sam jak twój.

Jest tak, ponieważ biblioteka jest wydana przez system. Wszystkie informacje o zdjęciu są ważne tylko w okresie posiadania biblioteki ALAssets. Tak więc group.numberOfAssets() będzie 0.

Rozwiązaniem jest unikanie biblioteki przed wydaniem pierwszego kontrolera. więc użyć następującego kodu:

static let library = ALAssetsLibrary() 
firstViewController.library.enmurate.....balabala 

Nadzieja może to komuś pomóc.

Powiązane problemy