好的,现在我正在制作像餐厅查找器这样的移动应用程序,我想要显示餐厅的照片
示例:restaurant x <image x>
这是一个代码:
if (ImageToDisplay != nil)
{
NSData * imageData = [[[NSData alloc] initWithContentsOfURL: [NSURL URLWithString: ImageToDisplay.URL]]autorelease];
ImageForRestaurant.image = [UIImage imageWithData: imageData];
}
问题是这个下载图片的过程可能需要很长时间。所以我希望这个过程在不同的线程上运行。
这样,之后的代码就可以运行而无需等待这个代码完成。
我该怎么办?
答案 0 :(得分:3)
if (ImageToDisplay != nil) {
[self performSelectorInBackground:@selector(loadImage:) object:ImageToDisplay];
}
- (void)loadImage:(ImageToDisplay *)image { //Background method
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
NSData * imageData = [[[NSData alloc] initWithContentsOfURL: [NSURL URLWithString: ImageToDisplay.URL]]autorelease];
[self performSelectorOnMainThread:@selector(setImageForRestaurant:) withObject:imageData waitUntilDone:NO];
[pool release];
}
- (void)setImageForRestaurant:(NSData *)imageData { //Change UI in main thread
ImageForRestaurant.image = [UIImage imageWithData: imageData];
}
我刚刚介绍了多线程的基础知识;我想它会满足你的目的
答案 1 :(得分:2)
使用ASIHTTPRequest库。请参阅此页面上的'创建异步请求':http://allseeing-i.com/ASIHTTPRequest/How-to-use
新图书馆AFNetworking看起来也很有希望。正如他们所说:
如果你厌倦了那些试图做太多的大型图书馆,如果你自己动手推出自己的hacky解决方案,如果你想要一个真正让iOS网络代码变得有趣的图书馆,请试试AFNetworking
答案 2 :(得分:2)
你试过吗
- (void)performSelectorInBackground:(SEL)aSelector withObject:(id)arg
我认为这是最简单的方式。