如何制作简单的多线程?

时间:2011-06-27 08:42:28

标签: objective-c multithreading cocoa-touch

好的,现在我正在制作像餐厅查找器这样的移动应用程序,我想要显示餐厅的照片

示例:restaurant x <image x>

这是一个代码:

if (ImageToDisplay != nil)
{
   NSData * imageData = [[[NSData alloc] initWithContentsOfURL: [NSURL URLWithString: ImageToDisplay.URL]]autorelease];
   ImageForRestaurant.image = [UIImage imageWithData: imageData];
}

问题是这个下载图片的过程可能需要很长时间。所以我希望这个过程在不同的线程上运行。

这样,之后的代码就可以运行而无需等待这个代码完成。

我该怎么办?

3 个答案:

答案 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

我认为这是最简单的方式。