2014-07-26 1 views
3

나는 최선을 다했으나 여기에 갇혀있다. iPhone 카메라 앨범에서 모든 사진을 가져오고 싶었습니다. 그래서이 ALAssestsLibrary API를 생각해냅니다.스위프트에서 ALAssetsGroup을 통해 열거하는 방법

photoLibrary.enumerateGroupsWithTypes(ALAssetsGroupType(ALAssetsGroupSavedPhotos), usingBlock: { group in 
     if group != nil 

     { 

     } 

     }, failureBlock: { error in println("\(error)")}) 

이 코드 줄을 추가하는 방법

group enumerateAssetsUsingBlock:groupEnumerAtion 

추가를 시도했지만 enumerateAssetsUsingBlock 속성이 표시되지 않습니다.

이것은 실제 코드입니다. !! !! 오브젝티브 C에서

dispatch_async(dispatch_get_main_queue(),^
     { 
      @autoreleasepool 
      { 
       ALAssetsLibraryAccessFailureBlock failureblock = ^(NSError *myerror) 
        { 
         NSLog(@"error occour =%@", [myerror localizedDescription]); 
       }; 

       ALAssetsGroupEnumerationResultsBlock groupEnumerAtion = ^(ALAsset *result, NSUInteger index, BOOL *stop) 
        { 
         if (result!=NULL) 
         { 
          if ([[result valueForProperty:ALAssetPropertyType] isEqualToString:ALAssetTypePhoto]) 
          { 
           [self.g_imageArray addObject:result]; 
          } 
         } 
       }; 

       ALAssetsLibraryGroupsEnumerationResultsBlock 
       libraryGroupsEnumeration = ^(ALAssetsGroup* group, BOOL* stop) 
        { 
         if (group == nil) 
         { 
          return; 
         } 

         if (group!=nil) { 
          [group enumerateAssetsUsingBlock:groupEnumerAtion]; 
         } 
         [self updatephotoList]; 
       }; 

       self.library = [[ALAssetsLibrary alloc] init]; 
       [self.library enumerateGroupsWithTypes:ALAssetsGroupSavedPhotos 
       usingBlock:libraryGroupsEnumeration 
       failureBlock:failureblock]; 
      } 
     }); 

답변

8

귀하의 enumerationBlockfailureBlock는 올바른 유형이 없습니다. 는 예를 들어, 열거 블록은

인수가 매개 변수로 (ALAssetsGroup!, UnsafeMutablePointer<ObjCBool>) 복용하고 Void을 반환 폐쇄는 것을 의미
typealias ALAssetsLibraryGroupsEnumerationResultsBlock = (ALAssetsGroup!, UnsafeMutablePointer<ObjCBool>) -> Void 

다음과 같이 정의된다

{ 
    (group: ALAssetsGroup!, stop: UnsafeMutablePointer<ObjCBool>) -> Void in 
    // ... 
} 

그래서 코드는 다음과 같아야합니다

photoLibrary.enumerateGroupsWithTypes(ALAssetsGroupType(ALAssetsGroupSavedPhotos), 
    usingBlock: { 
     (group: ALAssetsGroup!, stop: UnsafeMutablePointer<ObjCBool>) -> Void in 
     if group != nil { 
      group.enumerateAssetsUsingBlock({ 
       (asset: ALAsset!, index: Int, stop: UnsafeMutablePointer<ObjCBool>) -> Void in 
        // ... 
       }) 
     } 
    }, 
    failureBlock: { 
     (myerror: NSError!) -> Void in 
     println("error occurred: \(myerror.localizedDescription)") 
    }) 

스위프트의 "자동 유형 유추"기능으로 인해 다음과 같이 쓸 수도 있습니다 으로

photoLibrary.enumerateGroupsWithTypes(ALAssetsGroupType(ALAssetsGroupSavedPhotos), 
    usingBlock: { 
     group, stop in 
     if group != nil { 
      group.enumerateAssetsUsingBlock({ 
       asset, index, stop in 
       // ... 
       }) 
     } 
    }, 
    failureBlock: { 
     myerror in 
     println("error occurred: \(myerror.localizedDescription)") 
    }) 

그러나이 경우 첫 번째 버전은 아마도 더 쉽게 이해할 수 있습니다.

+0

고마워요! – garafajon

+0

@garafajon : UnsafePointer를 UnsafeMutablePointer로 변경해야했습니다. 당신은 완벽합니다. 이것은 Swift 버전간에 변경되었습니다. 답변을 업데이트했습니다. 의견을 보내 주셔서 감사합니다! –

관련 문제