2011-12-15 2 views
1

현재 테스트를 위해 친구에게 ipa를 보냅니다. 웃기는 건 내 테스터 중 한 명이 아이폰 4를 사용하여 IOS 5를 돌리고 있던 그녀의 사진을 볼 수 있다는 것입니다.Iphone : AlAssetsLibrary를 사용하여 사진을 표시 할 수 없습니다.

또 다른 2 명의 테스터가 있습니다 : 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

예, 정말 실망 스럽지만, 그게 어떻게이며 코드에서 위치 서비스를 사용할 수 없습니다 (좋은 생각입니다).

0

첫 번째 블록 ^assetGroupEnumerator[[<#block#> copy] autorelease]까지 힙으로 이동했습니다. 왜? 이 블록은 runloop에 의해 자동 릴리즈되기 때문에 많은 애셋이 열거되어야 할 필요가 있습니다.

3

또한 iOS 5.x에서 수집 된 자산으로 작업해야하는 경우 ALAssetsLibrary 인스턴스를 유지해야합니다. [library enumerateGroupsWithTypes:…]을 호출 한 직후 코드에서 ALAssetsLibrary 인스턴스를 해제하면 수집 된 모든 자산이 유효하지 않게됩니다.

도 참조 ALAssetsLibrary 문서 - 개요 :

"... 당신이 라이브러리 인스턴스에서 돌아 객체의 수명은 라이브러리 인스턴스의 수명에 묶여 있습니다 ...."

+0

죄송합니다. 답장을 늦게 보내 셨습니다. 이해가되지 않습니다. 나중에 사용하기 위해 AlAssets를 저장하려고 시도했다면,이 AlAsset은 null이거나 유사한 것입니다. 내 코드에서는 ALAssets 객체의 URL에만 관심이 있었기 때문에 객체 자체가 아니라 URL 만 유지했습니다. 그렇다면 여전히 객체의 수명에 대해 신경을 써야합니다. – LittleFunny

+1

이러한 수집 된 자산 인스턴스는 무효화 된 값 (또는 유사한 것)을 얻습니다. 그렇습니다. 저작물의 URL에만 관심이 있다면이 URL 만 수집하십시오. 나중에 [assetForURL : resultBlock : failureBlock :] 메소드에서이 메소드를 사용하여 자산 오브젝트를 다시 검색하십시오. 전체가 MOC (Managed Object Context)의 코어 데이터처럼 보이고 ALAssetsLibrary 인스턴스는이 MOC 인스턴스처럼 보입니다. 따라서 핵심 데이터에서이 MOC 인스턴스를 "닫을"때 그 뒤에있는 데이터에 액세스 할 수 없습니다. – Lorion

0

하나 더 많은 것들 : [self loadAssetToScrollView : assets];

__block YourExampleClassInstance *weakSelf = self; 

을 추가 블록 내부에이 weakSelf 인스턴스를 사용 :하지만 블록 내부에 이런 블록 전에 자기의 약한 참조를 얻을

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

이유는 무엇입니까? 유지주기를 피하려면.

+0

'__weak' (또는 iOS 4에서'__unsafe_unretained')을'__block' 대신 사용 하시겠습니까? –

+0

나에게이 이유를 줄 수 있니? 미안하지만 나는 객관적으로 새로운 것을 배우고있다. 나는 아직도 배울 것이 많다. : – LittleFunny

+0

@ MarkAdams Hi Mark, 현재 ARC를 사용하고 있지 않습니다.하지만 ARCed 프로젝트를 사용하면 절대적으로 맞습니다. – Lorion

관련 문제