2011-11-23 52 views
0

請你考慮以下方法:目標C:方法來更新的UIImage

+(void)getGravatarFromEmail: (NSString *)email ofSize:(NSString *)size toImg:(UIImage *)myImg 
{ 
    NSString *hash = [md5 getMD5Hash:email]; // external method to calculate md5 hash 
    NSURL *gravatarUrl = [NSURL URLWithString:[NSString stringWithFormat:@"http://gravatar.com/avatar/%@?s=%@",hash,size]]; 

    ASIHTTPRequest *request = [[ASIHTTPRequest alloc]initWithURL:gravatarUrl]; 
    [request setCompletionBlock:^(void) { 
     NSData *data = [request responseData]; 
     myImg = [UIImage imageWithData:data]; // ERROR HERE!! 
    }]; 
    [request setDelegate:self]; 
    [request startAsynchronous]; 
} 

這種方法只是使API調用的Gravatar檢索圖像。然後我會用抓取的圖像更新'myImg'。

但是,我在嘗試將代碼中的圖像分配到'myImg'時出錯。 錯誤是:

變量未分配的(缺少__block類型說明符)

我任何線索?

回答

5
+(void)getGravatarFromEmail:(NSString *)email ofSize:(NSString *)size 
      toImg:(UIImage *)myImg { 
    NSString *hash = [md5 getMD5Hash:email]; // external method to calculate md5 hash 
    NSURL *gravatarUrl = [NSURL URLWithString:[NSString 
      stringWithFormat:@"http://gravatar.com/avatar/%@?s=%@",hash,size]]; 

    ASIHTTPRequest *request = [[ASIHTTPRequest alloc]initWithURL:gravatarUrl]; 

    __block UIImage *blockImage = myImg; 

    [request setCompletionBlock:^(void) { 
     NSData *data = [request responseData]; 
     blockImage = [UIImage imageWithData:data]; // ERROR HERE!! 
    }]; 
    [request setDelegate:self]; 
    [request startAsynchronous]; 
} 

我仍然是一個新手,當涉及到塊,但我相信上述修改應該允許您的代碼進行編譯。也就是說,我並不確定你的方法正確地使用該塊。首先,這個方法被混淆地命名(至少對於大多數退伍軍人來說)。如果返回(void),並在名稱有get,它好像你應該有一個指針的指針,像這樣一個UIImage:

+(void)getGravatarFromEmail:(NSString *)email ofSize:(NSString *)size 
       toImg:(UIImage **)myImg; 

我相信,如果你返回void,這是唯一的辦法你將能夠用myImg/blockImage做任何事情。

另外,這是一種類方法,您將ASIHTTPRequest的委託設置爲您的類對象,而不是您的對象的實例?

反正到你得到的錯誤:

默認情況下,我相信塊都只讀訪問的變量。爲了能夠從塊內部修改myImg(或blockImage)變量,需要在變量前加上__block關鍵字。 (也就是說,由於上面提到的原因,我不是很確定能夠從塊內部修改該變量有多好)。