2013-06-08 10 views
10

Sto cercando di ottenere tutte le immagini presenti in photos.app e visualizzarle in UICollectionView. Ho questo codice per recuperare le immagini:ALAssetPrivate oltre la durata della sua proprietà 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); 
        }]; 

Questo è nel viewDidLoad e poi:

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

questo pezzo di codice è l'invio di una matrice di un altro controllore che fisserà le immagini al mio UICollectionView . Il problema è che sto ricevendo un errore "tentativo non valido di accedere oltre la durata della sua proprietà ALAssetsLibrary" e se provo a NSLog il mio array il risultato è qualcosa come "ALAsset - Type: Unknown, URLs: (null)".

Ho cercato su internet e ho trovato una soluzione. Dovrei aggiungere questa riga di codice ma non funziona. Il codice è:

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

Chiunque è in grado di aiutarmi su come ottenere gli URL immagini corrette da mostrare?

+0

(ALAssetsLibrary *) defaultAssetsLibrary metodo charme per me! – kb920

risposta

15

La soluzione è quella di utilizzare sempre la stessa libreria per tutti gli accessi alle risorse in tutte le classi. La soluzione singleton che mostri sopra è buona, a patto che tutte le tue classi chiamino defaultAssetsLibrary e nessuno di loro assegni/inizializzi il proprio ALAssetsLibrary.

+0

Grazie, ma questo purtroppo non mi ha aiutato. Sto solo passando un array in un'altra classe. Accedo a ALAssetsLibrary solo una volta e non riesco a capire cosa sia sbagliato. Non penso di crearne un'altra, ma forse mi sbaglio. Puoi ricontrollare il mio codice per favore? :) – BalestraPatrick

+2

È necessario spostare il metodo defaultAssetsLibrary da qualche parte in modo che la libreria non venga distrutta. Il delegato dell'app, o il primo controller della vista (se spinge il secondo controller della vista che sceglie le risorse e le rimanda al primo). – Wain

1

Ho lo stesso problema. E alla fine l'ho risolto.

Questa è la mia condizione: ho due controller, il primo si spinge al secondo. Nel primo mi inizializzato libreria utilizzando il codice seguente:

let library = ALAssetsLibrary() 

e metto tutte le informazioni di gruppo in una matrice, in modo che posso usare nel secondo controller della vista. Ma questo può portare a nessuna foto in gruppo.

e il messaggio di errore è uguale al tuo.

Questo perché la libreria viene rilasciata dal sistema. E tutte le informazioni sulla foto sono valide solo durante la vita della sua ALAssetsLibrary proprietaria. Quindi group.numberOfAssets() sarà 0.

La soluzione è evitare che la libreria venga rilasciata prima del rilascio del primo controller. Così ho utilizzare il seguente codice:

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

Spero che questo possa aiutare qualcuno.

Problemi correlati