2012-12-17 53 views
0

我使用此代碼檢索所有的圖像形成我的設備,但它不是返回一個結果需要幫助有關資產庫

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    void (^assetEnumerator)(ALAsset *, NSUInteger, BOOL *) = ^(ALAsset *result, NSUInteger index, BOOL *stop) { 
     if(result != NULL) { 
      NSLog(@"See Asset: %@", result); 
      [_assets addObject:result]; 
      // Here storing the asset's image URL's in NSMutable array urlStoreArr 
      NSURL *url = [[result defaultRepresentation] url]; 
      [_urlStoreArr addObject:url]; 
     } 
    }; 

    void (^assetGroupEnumerator)(ALAssetsGroup *, BOOL *) = ^(ALAssetsGroup *group, BOOL *stop) 
    { 
     if(group != nil) 
     { 
      [group enumerateAssetsUsingBlock:assetEnumerator]; 
     } 
    }; 

    _urlStoreArr = [[NSMutableArray alloc] init]; 
    _assets = [[NSMutableArray alloc] init]; 
    _library = [[ALAssetsLibrary alloc] init]; 

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



    [self UploadImagesToServer]; 

} 

-(void) UploadImagesToServer 
{ 
    for (int i=0; i<[_urlStoreArr count]; i++) 
    { 
     // To get the each image URL here... 

     NSString *str = [_urlStoreArr objectAtIndex:i]; 
     NSLog(@"str: %@",str); 

     // Need to upload the images to my server.. 
    } 
} 
+0

這是一個很好的使用Assets庫的教程,可能對您有所幫助。 http://www.icodeblog.com/2010/07/08/asset-libraries-and-blocks-in-ios-4/ –

回答

2

您正在使用_urlStoreArr它被初始化之前。

當您定義塊時,它們將獲取塊中使用的變量的當前本地值。

因此,在assetEnumerator塊中,您使用的是_urlStoreArr,但是直到後面的代碼纔會初始化它。

我假設_urlStoreArr是一個iVar,因爲它有一個前導下劃線。如果您使用ARC,則iVar初始化爲nil,因此您的assetEnumerator塊正在向nil發送消息。在Objective-C中這是合法的,但它只返回nil

你有兩個選擇來解決這個問題。

  1. 移動的_urlStoreArr = [[NSMutableArray alloc] init];聲明的assetEnumerator
  2. 的優選方式的上述定義 - 不直接使用的Ivar,使用屬性的語法。即,而不是[_urlStoreArr addObject:url];嘗試[self.urlStoreArr addObject:url];。這是有效的,因爲在使用屬性訪問時,在定義時沒有使用當前值_urlStoreArr,因此您使用的是塊運行時的值,即iVar初始化後的值。
+0

感謝您的答覆,但是當viewdidload將執行塊不會打電話,所以這方式_urlStoreArr將首先分配init ... –

+0

這不是關於塊何時運行,而是何時定義。您直接使用iVar,該塊將在創建時存儲該參考。塊沒有運行沒關係。 – Abizern

+0

好吧...謝謝你有用的解決方案:) –