0

http://www.icodeblog.com/asset-libraries-and-blocks-in-ios-4/にある例を自分のアプリに取り入れようとしています。これは私がこれまでに持っているものです:

@interface UserTabBarController : UIViewController <NSFetchedResultsControllerDelegate, UITabBarDelegate> {
    NSMutableArray *assets;
}
    -(void)usingAssets;
@end

@implementation UserTabBarController
    -(void)usingAssets{

        void (^assetEnumerator)(struct ALAsset *, NSUInteger, BOOL *) = ^(ALAsset *result, NSUInteger index, BOOL *stop) {
            if(result != NULL) {
            NSLog(@"See Asset: %@", result);
            [assets addObject:result];
            NSLog(@"assets count: %i", assets.count);
            }
            else {
            NSLog(@"AssetEnum: result nil or end of list");
            }
        };

        void (^assetGroupEnumerator)(struct ALAssetsGroup *, BOOL *) =  ^(ALAssetsGroup *group, BOOL *stop) {
        if(group != nil) {
            [group enumerateAssetsUsingBlock:assetEnumerator];
            }
            else {
            NSLog(@"GroupEnum: group nil or end of list");
            }
            NSLog(@"assets count in GroupEnum: %i", assets.count);
    };


        ALAssetsLibrary* library = [[ALAssetsLibrary alloc] init];

        [library enumerateGroupsWithTypes:ALAssetsGroupAll
                               usingBlock:assetGroupEnumerator
                                failureBlock: ^(NSError *error) {
                   NSLog(@"Failure: %@", error.description);
            }];
        [library release];
    }

usingAssets を呼び出すたびに、フォト アルバムの最新のコンテンツをNSMutableArray* assets. ViewController の ViewDidLoad でこれらすべてをまとめます。

- (void)viewDidLoad {
    [super viewDidLoad];
    assets = [[NSMutableArray alloc] init];
    [self usingAssets];
    for (ALAsset* a in self.assets){
        NSLog(@"Item in asset");
    }
    NSLog(@"Asset count: %i", assets.count);

    [self usingAssets];
    NSLog(@"Asset count: %i", assets.count);

}

これまでのところ、上記のリンクに示されている例に従っていると思います。問題は、UserTabBarController のスコープ内でassets.countは 0 のままですが、ブロックのスコープ内ではカウントが増加していることを示し、両方の呼び出し間で持続することです (予想どおり)。私が奇妙だと思うのは、Asset count: 0 という行がログのかなり後で表示されるか、(ブロック内から呼び出される) アセットを表示する行がより早く表示されるはずだということです。

2011-02-21 14:22:59.140 iPCS[7219:207] 資産数: 0
2011-02-21 14:23:08.539 iPCS[7219:207] 資産数: 0

2011-02-21 14:14:03.363 iPCS[7139:207] アセットを参照: ALAsset - タイプ:写真、URL:{ "public.jpeg" = "assets-library://asset/asset.JPG?id=1000000001&ext =JPG"; }
2011-02-21 14:14:03.363 iPCS[7139:207] 資産数: 1

2011-02-21 14:14:03.365 iPCS[7139:207] アセットを参照: ALAsset - タイプ:写真、URL:{ "public.jpeg" = "assets-library://asset/asset.JPG?id=1000000002&ext =JPG"; }
2011-02-21 14:14:03.366 iPCS[7139:207] 資産数: 2

2011-02-21 14:14:03.367 iPCS[7139:207] AssetEnum: 結果 nil またはリストの
終わり
21 14:14:03.368 iPCS[7139:207] GroupEnum: グループ nil またはリストの終わり
2011-02-21 14:14:03.368 iPCS[7139:207] GroupEnum の資産数: 2

2011-02-21 14:14:03.370 iPCS[7139:207] アセットを参照: ALAsset - タイプ:写真、URL:{ "public.jpeg" = "assets-library://asset/asset.JPG?id=1000000001&ext =JPG"; }
2011-02-21 14:14:03.371 iPCS[7139:207] アセット数: 3

2011-02-21 14:14:03.373 iPCS[7139:207] アセットを参照: ALAsset - タイプ:写真、URL:{ "public.jpeg" = "assets-library://asset/asset.JPG?id=1000000002&ext =JPG"; }
2011-02-21 14:14:03.374 iPCS[7139:207] 資産数: 4

2011-02-21 14:14:03.374 iPCS[7139:207] AssetEnum: 結果 nil またはリストの
終わり
21 14:14:03.375 iPCS[7139:207] GroupEnum: グループ nil またはリストの終わり
2011-02-21 14:14:03.376 iPCS[7139:207] GroupEnum の資産数: 4

皆さんは何と言っていますか?

編集: さらにいくつかのテストを実行usingAssetsし、ビューのボタンを使用して呼び出すと、assets配列が適切に設定されました! これは、読み込み時にviewDidLoad、ブロックで見られるオブジェクトと、ブロックの呼び出しインスタンスで見られるオブジェクトとの間にある種の切断があることを意味します。なぜこの動作を示しているのか、誰にもアイデアがありますか?

編集 2: 1 週間以上コードをいじっていますが、NSArray アセットを取得してコンテンツを正確に表示することができません。ブロックが実行される順序に関連付ける必要があると判断しました。を呼び出すusingAssetsと、メソッド自体は完了しますが、ブロックはすぐには実行されません。したがって、メソッドをボタンに結び付けて、すぐに の内容を印刷するとします。assetsその内容は空です (ライブラリに 2 つの画像があります)。ボタンをもう一度クリックすると、コンテンツに 2 つのアイテムが表示されます。3 回クリックすると、4 と表示されます。制御がユーザーに返された後 (アプリケーション ループに戻る)、ブロックが実行されているように見えます。それらが存在するパスに基づいてそれらをロードしますが、期待どおりに動作しない理由を理解できる場合は、アセットを使用したいと思います

4

1 に答える 1

1

私がこれのために行ったことは、グループがいつ列挙を終了したかを確認するために nil であることを確認することです。その後、カウントを確認できます...

if(group == nil) { 
    NSLog('Assets finished renumerating, %i found', [self.assets count]); 
} else { 
    [group enumerate...]; 
}

また、アセットをプロパティとして使用している場合は、更新されるように全体で self.assets を使用してください。このコードは今私のために働いています:)

于 2011-04-10T19:36:17.227 に答える