Iphone 如何将图像下载移动到后台线程以平滑UI?

Iphone 如何将图像下载移动到后台线程以平滑UI?,iphone,objective-c,multithreading,cocoa-touch,Iphone,Objective C,Multithreading,Cocoa Touch,我有这个方法,有人建议我在后台线程上下载图像。有人能帮我吗 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { NSURL *myURL=[NSURL URLWithString:[self.picturesArray objectAtIndex:indexPath.row]]; NSData *myData1 = [[

我有这个方法,有人建议我在后台线程上下载图像。有人能帮我吗

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{

    NSURL *myURL=[NSURL URLWithString:[self.picturesArray objectAtIndex:indexPath.row]]; 
    NSData *myData1 = [[NSData alloc] initWithContentsOfURL:myURL];
    UIImage *myImage = [[UIImage alloc] initWithData:myData1]; 

    cell.imageView.image = myImage;

    return cell;
}

撇开显示的代码本身不可能工作这一事实不谈。。。你想做的很简单。您的计算单元可以是自定义UITableCell,您可以在其中定义在后台下载的方法。在cellforrowatinedexpath:,您可以调用该方法,例如
[cell loadimaginbackground:myURL]
。聪明的一点是,单元格当然知道其中的内容,即要设置的UIImageView。因此,后台加载完成后,只需设置图像,您的表就会保持响应。

抛开显示的代码本身不可能工作的事实不谈。。。你想做的很简单。您的计算单元可以是自定义UITableCell,您可以在其中定义在后台下载的方法。在cellforrowatinedexpath:,您可以调用该方法,例如
[cell loadimaginbackground:myURL]
。聪明的一点是,单元格当然知道其中的内容,即要设置的UIImageView。因此,后台加载完成后,只需设置映像,您的表就会保持响应。

您可以使用异步下载的UIImageView。看看这个:


您应该创建UITableViewCell子类并向其添加异步ImageView,然后执行[cell.AsynchronousImageView loadImageFromURLString:[self.picturesArray objectAtIndex:indexPath.row].

您可以使用异步下载的UIImageView。看看这个:


您应该创建一个UITableViewCell子类,并向其中添加一个异步ImageView,然后执行[cell.asyncImageView loadImageFromURLString:[self.picturesArray objectAtIndex:indexPath.row].

谢谢,我刚刚发布了与下载图像相关的代码,不是全部。但是如果可能的话,我宁愿将代码保留在这个方法中,而不是将其作为自定义单元格类的一部分。您也可以这样做。:-)它不会那么干净(这是一个意见问题),但它会起作用。您可以创建一个方法,使用类似于
performSelectorInBackground
的方法调用该方法,并向其传递一个带有上下文的对象,或者传递一个单元格(设置了要加载的URL)或indexPath,或者你的后台方法知道该做什么以及在哪里显示结果。在每次下载中使用后台线程的明显缺点是很难取消正在运行的下载。因此,如果用户快速滚动,很可能会耗尽内存。更好的方法是使用
NSURLConnection
,它可以使用主线程(用于代理回调),而不会在加载时阻塞。当然,您也可以在后台线程上运行
NSURLConnection
(使用自己的runloop),但这通常是不值得的。你有什么代码片段可以让我开始吗?在我的CellForRowatinex方法中,我会调用另一种方法,将图像加载到背景中,然后将它们传递回CellForRowatinex?@omz,这是一个很好的观点,也是我不得不自己实现的一个观点。(我忘记了那个细微差别:-)我的解决方案是定义一个自定义单元格,每个单元格都有一个背景线程。但是为了解决在图像下载完成之前重新使用手机的问题,因为用户正在快速滚动列表,我在我的手机类中实现了方法
prepareForReuse
。在那里,我可以很容易地检测到单元格的后台线程是否正在运行,并取消它!实际上,它工作得很好。谢谢,我只是发布了与下载图片相关的代码,不是全部。但是如果可能的话,我宁愿将代码保留在这个方法中,而不是将其作为自定义单元格类的一部分。您也可以这样做。:-)它不会那么干净(这是一个意见问题),但它会起作用。您可以创建一个方法,使用类似于
performSelectorInBackground
的方法调用该方法,并向其传递一个带有上下文的对象,或者传递一个单元格(设置了要加载的URL)或indexPath,或者你的后台方法知道该做什么以及在哪里显示结果。在每次下载中使用后台线程的明显缺点是很难取消正在运行的下载。因此,如果用户快速滚动,很可能会耗尽内存。更好的方法是使用
NSURLConnection
,它可以使用主线程(用于代理回调),而不会在加载时阻塞。当然,您也可以在后台线程上运行
NSURLConnection
(使用自己的runloop),但这通常是不值得的。你有什么代码片段可以让我开始吗?在我的CellForRowatinex方法中,我会调用另一种方法,将图像加载到背景中,然后将它们传递回CellForRowatinex?@omz,这是一个很好的观点,也是我不得不自己实现的一个观点。(我忘记了那个细微差别:-)我的解决方案是定义一个自定义单元格,每个单元格都有一个背景线程。但是为了解决在图像下载完成之前重新使用手机的问题,因为用户正在快速滚动列表,我在我的手机类中实现了方法
prepareForReuse
。在那里,我可以很容易地检测到单元格的后台线程是否正在运行,并取消它!实际上,它工作得很好。