行。我不是很清楚块,但我经常使用它们;特别是在进行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。
有人会帮忙吗?
答案 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];
}