2012-01-31 44 views
1

OK。我不完全清楚块,但我经常使用它们;尤其是在执行ASIHTTPRequest时。我想传递一个对象到块中,并在请求完成时为该对象分配一个值,但我不知道如何在块内使对象“可用”。将对象传入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

anImageObject将不得不通过引用传递。也就是UIImage **,并在调用方法时传递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]; 
}