1

私は現在、テストのためにipaを友達に送っています。面白いことに、私のテスターの1人は、iPhone4を使用してIOS5を実行していた彼女の電話に保存されている彼女の写真を見ることができました。

別の2人のテスター:1人はiPhone 4(IOS 4.3.3)とiPhone 3GS(IOS 5.0.1)を持っており、どちらも自分の携帯電話に保存されている写真を見ることができません。

これらは私が使用したコードです:

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

void (^assetEnumerator)(ALAsset *, NSUInteger, BOOL *) = ^(ALAsset *result, NSUInteger index, BOOL *stop) {
    if(result != NULL) {
        //NSLog(@"See Asset: %@", @"ggg");
        [assets addObject:result];

    }
};

NSLog(@"location = %i      length = %i ", range->location, range->length );

void (^assetGroupEnumerator)(ALAssetsGroup *, BOOL *) =  ^(ALAssetsGroup *group, BOOL *stop) {
    if(group != nil) {

        NSRange  *datarange = malloc(sizeof(NSRange));

        range->total = [group numberOfAssets];
        datarange->location = [group numberOfAssets] - range->location - range->length;
        datarange->length = range->length;
        NSLog(@" total = %i", range->total);

        int location = [group numberOfAssets] - range->location - range->length;

        if (location < 0)
        {
            datarange->location = 0;
            datarange->length = [group numberOfAssets] - range->location;
        }

        NSIndexSet *indexset = [ [NSIndexSet alloc] initWithIndexesInRange:*datarange];

        [group enumerateAssetsAtIndexes:indexset options:NULL
                             usingBlock:assetEnumerator];

        [indexset release];
        free(datarange);

        [self loadAssetToScrollView:assets]; 

    }

};    

    [assets release];

    assets = [[NSMutableArray alloc] init];


    [library enumerateGroupsWithTypes:ALAssetsGroupSavedPhotos
                           usingBlock:assetGroupEnumerator
                         failureBlock: ^(NSError *error) {
                             NSLog(@"Failure");
                         }];

    [library release];

他のスレッドで非同期のことについて誰かが言っているのを見ましたが、そうであるかどうかはわかりません。彼は、dispatch_asyncを列挙グループブロックに入れると言います。

誰かが何が悪いのか知っていますか?

さらに、iOS 4.3.3のテスターの1人は、[一般]-> [設定]で位置情報サービスを有効にした後、自分の写真を表示できます。なぜそれを有効にしなければならないのですか?アプリケーションを使用するユーザーにとって非常に邪魔になるため、コードで有効にできますか?

4

4 に答える 4

3

また、iOS 5.xALAssetsLibraryでは、収集されたアセットを操作する必要がある限り、インスタンスを保持する必要があります。コードのようにインスタンスを解放すると、収集されたすべてのアセットをALAssetsLibrary呼び出した直後に無効になります。[library enumerateGroupsWithTypes:…]

ドキュメントも参照してくださいALAssetsLibrary-概要:

「…ライブラリインスタンスから取得するオブジェクトの有効期間は、ライブラリインスタンスの有効期間に関連付けられています。…」

于 2011-12-15T21:53:48.373 に答える
1

はい、それは信じられないほどイライラしますが、それはそうです、そしてあなたはコードで位置情報サービスを有効にすることができません(それは良いことですが)。

于 2011-12-15T11:12:07.950 に答える
0

最初のブロック^assetGroupEnumeratorをでヒープに移動します[[<#block#> copy] autorelease]。なんで?このブロックはrunloopによって自動解放されるため、多くのアセットがある場合は、列挙する必要があります。

于 2011-12-15T21:48:36.103 に答える
0

もう1つ、[self loadAssetToScrollView:assets]を使用しないでください。ブロック内ですが、次のようにブロックの前に自己の弱参照を取得します。

__block YourExampleClassInstance *weakSelf = self;

さらに、ブロック内でこのweakSelfインスタンスを使用します。

[weakSelf loadAssetToScrollView:assets];
void (^assetGroupEnumerator)… = ^(ALAssetsGroup *group, BOOL *stop) {
…
};

なんで?保持サイクルを回避するため。

于 2011-12-15T22:00:15.493 に答える