【问题标题】:Objective C: Method to update UIImageObjective C: 更新 UIImage 的方法
【发布时间】:2011-11-23 04:33:53
【问题描述】:

请您考虑以下方法:

+(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];
}

此方法只是对 Gravatar 进行 API 调用以检索图像。然后我会用抓取的图像更新“myImg”。

但是,我在尝试将图像分配到“myImg”时遇到错误,如代码中所述。 错误是:

变量不可赋值(缺少 __block 类型说明符)

有什么线索吗?

【问题讨论】:

    标签: objective-c xcode ios4 uiimage


    【解决方案1】:
    +(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 做任何事情的唯一方法。

    另外,这是一个类方法,您将ASIHTTPRequests 委托设置为您的类对象,而不是您的对象的实例?

    无论如何,关于你得到的错误:

    默认情况下,我相信块对变量具有只读访问权限。为了能够从块内部修改myImg(或blockImage)变量,您需要在变量前面加上__block 关键字。 (也就是说,由于上述原因,我不太确定能够从块内部修改该变量有什么好处)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-07-14
      • 1970-01-01
      • 2023-03-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多