将对象传递到ASIHTTPRequest块

时间:2012-01-31 03:23:27

标签: ios block

行。我不是很清楚块,但我经常使用它们;特别是在进行ASIHTTPRequest时。我想将一个对象传递给块并让请求在完成时为对象赋值,但我不知道如何在块中使对象“可用”。

这是我的方法......

- (void)fetchImageAsynchronously:(NSURL *)theURL intoImageObject:(UIImage *)anImageObject
{
    __block ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:theURL];
    [request setDownloadCache:[ASIDownloadCache sharedCache]];
    [request setCacheStoragePolicy:ASICachePermanentlyCacheStoragePolicy];
    [request setCompletionBlock:^{
        NSData *responseData = [request responseData];
        anImageObject = [UIImage imageWithData:responseData];
    }];
    [request setFailedBlock:^{
        // NSError *error = [request error];
    }];
    [request startAsynchronous];
}

因此,当请求完成时,我希望anImageObject的值是获取的图像。但是块内没有anImageObject。

有人会帮忙吗?

1 个答案:

答案 0 :(得分:1)

anImageObject必须通过引用传递。也就是说,UIImage **,并在调用方法时传递anImageObject的地址。

这不是一个很好的设计,因为你还必须管理anImageObject的生命周期,并且还可能发布一些已准备就绪的通知。也就是说,如果在下载图像数据所花费的时间内释放anImageObject,则此代码将中断。你不会知道anImageObject是用数据初始化的。

- (void)fetchImageAsynchronously:(NSURL *)theURL intoImageObject:(UIImage **)anImageObject
{
    __block ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:theURL];
    [request setDownloadCache:[ASIDownloadCache sharedCache]];
    [request setCacheStoragePolicy:ASICachePermanentlyCacheStoragePolicy];
    [request setCompletionBlock:^{
        NSData *responseData = [request responseData];
        *anImageObject = [UIImage imageWithData:responseData];
    }];
    [request setFailedBlock:^{
        // NSError *error = [request error];
    }];
    [request startAsynchronous];
}