2013-01-05 17 views
2

在這裏用塊和ALAssetLibrary例程苦苦掙扎。我已經瀏覽了WWDC和斯坦福大學的視頻片段,並閱讀了一些內容,但還沒有完全點擊我。通過專輯名稱獲取ALAssetsGroupAlbum的posterImage

我想要做的是獲取自定義照片庫的posterImage。下面的第一個例程位於我的主視圖控制器中,並調用功能getPosterImageForAlbum:,它位於ALAssetLibrary類擴展中。

我與/迷茫掙扎的東西約/曾嘗試:

  1. 我應該傳遞一個參考(CGImageRef或UIImage的),並有 ALAssetLibrary方法對其進行設置或定義爲一個返回值 ALAssetLibrary方法,然後處理我的主類中的圖像? 我試過這兩種方式沒有成功。

  2. ALAssetLibrary枚舉方法的異步性質是 很難處理 - 所以我想我做錯了。

  3. 定義一個塊作爲參數傳遞:我總是需要 typedef它嗎?

我認爲我已經掌握了所有的概念零件和零件,但我還沒有能夠將它們與對塊的工作理解清楚。任何提示或指針*以良好的文章將不勝感激。 //

- (IBAction)getPosterImage:(id)sender { 

    NSString *groupName = self.groupNameField.text; 
    NSLog(@"%@", groupName); 

    __weak typeof(self) weakSelf = self; 

    CGImageRef tmpImg = [weakSelf.library getPosterImageForAlbum:groupName withCompletionBlock:(CGImageRef)(^GetPosterImageCompletion)(NSError *error){ 
     if (error!=nil) { 
      NSLog(@"getPosterImage error: %@", [error description]); 
     } else { 
      if (tmpImg != nil){ 
       UIImage * posterImg = [UIImage imageWithCGImage:tmpImg]; 
       weakSelf.pImage.image = posterImg; 
      } 
     } 
    }]; 
} 

//這是的ALAssetLibrary

typedef CGImageRef(^GetPosterImageCompletion)(NSError* error); 

-(CGImageRef)getPosterImageForAlbum:(NSString*)albumName 
       withCompletionBlock:(GetPosterImageCompletion)completionBlock 
{ 
    __block BOOL albumWasFound = NO; 
    __block CGImageRef thePosterImage = nil; 

    SaveImageCompletion test; 
    //search all photo albums in the library 
    [self enumerateGroupsWithTypes:ALAssetsGroupAlbum 
         usingBlock:^(ALAssetsGroup *group, BOOL *stop) { 

      NSLog(@"this group name: %@", 
        [group valueForProperty:ALAssetsGroupPropertyName]); 

      //compare the names of the albums    
      if ([albumName compare: 
       [group valueForProperty:ALAssetsGroupPropertyName]]==NSOrderedSame) { 

       printf("matches \n"); //target album is found 
       albumWasFound = YES; 
       thePosterImage = group.posterImage; 
       *stop = true; 
       return ; 
      } 

     } failureBlock: test]; 

    if (albumWasFound==NO) { 
     NSLog(@"%@", @"No group found"); 
    } 
    return thePosterImage; 
} 

回答

2

我編輯我原來的答覆的一大途徑的擴展,因爲我只貼後,我才真正瞭解你正試圖做 - 在ALAssetLibrary上編寫一個類擴展名,用於按名稱查找專輯的海報圖像,而不是按任何可能的名稱按名稱查找專輯的海報圖像。

我會通過編寫一個擴展方法來處理這個問題,該方法需要接受UIImage類型的單個參數(或者也可以是NSError參數)作爲參數。在該完成塊中,調用者可以對異步返回的圖像做任何他們想做的事情。有沒有必要的typedef塊 - 你可以這樣寫的方法:

- (void) getPosterImageForAlbumNamed: (NSString *) albumName completionBlock: (void (^)(UIImage *, NSError *)) completionBlock 
{ 
    __block ALAssetsGroup * foundAlbum = nil; 
    [self enumerateGroupsWithTypes: ALAssetsGroupAlbum 
          usingBlock:^(ALAssetsGroup *group, BOOL *stop) { 
           if (group) { 
            if ([(NSString *) [group valueForProperty: ALAssetsGroupPropertyName] compare: albumName] == NSOrderedSame) { 
             *stop = YES; 
             foundAlbum = group; 
             completionBlock([UIImage imageWithCGImage: [group posterImage]], nil); 
            } 
           } else{ 
            if (! foundAlbum) { 
             NSLog(@"Album wasn't found"); 
             // completionBlock(nil, XX SOME ERROR XX); 
            } 
           } 
          } failureBlock:^(NSError *error) { 
           NSLog(@"Couldn't access photo library"); 
           // completionBlock(nil, XX SOME ERROR XX); 
          }]; 

} 

然後,你可以調用的方法是這樣的:

-(IBAction) getPosterForAlbum: (id) sender 
{ 
    NSString * albumName = self.textField.text; 
    ALAssetsLibrary * library = [[ALAssetsLibrary alloc] init]; 

    __weak typeof(self) weakSelf = self; 
    [library getPosterImageForAlbumNamed: albumName completionBlock:^(UIImage * image, NSError * error) { 
     if (! error) { 
      [weakSelf doSomethingWithPosterImage: image]; 
     } 
    }]; 
} 

是沿着你行正試圖做什麼? (對不起,主要編輯...)

+0

嘿謝謝花時間!第二款咖啡開始使用後,我必須咀嚼這些東西。我只使用了類擴展,因爲我開始使用一些教程代碼(許多代碼編寫的代碼都是通過代碼清除的) –