2013-06-08 9 views
10

photos.appにあるすべての画像を取得してUICollectionViewに表示しようとしています。私は、画像を取得するには、このコードを持っている:ALAssetPrivateは所有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); 
        }]; 

これは、その後のviewDidLoadであると:

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

コードのこの作品は、私のUICollectionViewに画像を設定しますアレイを別のコントローラに送信しています。問題は、「所有しているALAssetsLibraryのライフタイムを過ぎてアクセスしようとすると無効な試み」というエラーが発生し、NSLogの配列に結果が「ALAsset-Type:Unknown、URLs:(null)」のようなものです。

私はインターネットを調べて解決策を見つけました。このコード行を追加する必要がありますが、動作しません。コードは次のとおりです。

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

誰もが正しい画像URLを表示するのを手伝ってくれますか?

+0

(ALAssetsLibrary *)defaultAssetsLibraryメソッドcharme for me! – kb920

答えて

15

解決策は、すべてのクラスのアセットへのすべてのアクセスに常に同じライブラリを使用することです。あなたが上に示したシングルトンの解決策は、すべてのクラスがdefaultAssetsLibraryを呼び出し、それらのどれも自身のALAssetsLibraryを割り当て/初期化していない限り、良いことです。

+0

ありがとうございましたが、残念ながらこれは私を助けませんでした。私は配列を別のクラスに渡すだけです。私はALAssetsLibraryに一度だけアクセスし、何が間違っているのか理解できません。私はそれの別のインスタンスを作成しているとは思わないが多分私は間違っている。私のコードを二重チェックしていただけますか? :) – BalestraPatrick

+2

defaultAssetsLibraryメソッドをどこかに共通の場所に移動して、ライブラリが破棄されないようにする必要があります。アプリケーションデリゲート、または最初のビューコントローラ(アセットを選択して最初のビューコントローラに戻す2番目のビューコントローラをプッシュする場合)。 – Wain

1

私は同じ問題があります。そして私はついにそれを解決しました。

これは私の状態です:私は2つのコントローラを持っています。最初のもので、私は、次のコードを使用して、ライブラリー初期化:

let library = ALAssetsLibrary() 

およびIは、第2のビューコントローラでそれらを使用できるように、私は、アレイ内のすべてのグループ情報を置きます。しかし、これはグループ内の写真につながりません。

エラーメッセージはあなたのものと同じです。

これは、システムによってライブラリがリリースされたためです。また、すべての写真情報は所有しているALAssetsLibraryの存続期間中のみ有効です。したがって、group.numberOfAssets()は0になります。

解決策は、最初のコントローラのリリース前にライブラリが解放されるのを避けます。これが誰かを助けるかもしれない

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

希望: は、だから私は、次のコードを使用します。

関連する問題