在UITableView中加载时混合图像

时间:2015-04-02 21:21:28

标签: xcode uitableview

我有一个基于Xcode objective-c构建的应用程序,它有一个tableview,可以使用PHP从MySql加载图像和一些信息。除了图像之外,一切都很好,当我向下滚动桌子需要很长时间并将图像(图像A进入图像B)混合几秒钟然后它就会变成它的位置,特别是当我滚动表格太快时:

她是我的代码:

- (void)downloadImageWithURL:(NSURL *)url completionBlock:(void (^)(BOOL succeeded, UIImage *image))completionBlock

{

NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
[NSURLConnection sendAsynchronousRequest:request
queue:[NSOperationQueue mainQueue]
completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) {
if ( !error )
{
UIImage *image = [[UIImage alloc] initWithData:data];
completionBlock(YES,image);
} else{
completionBlock(NO,nil);
}
}];

}


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

{

NSString *one = listObjects.theUserId; // the listObjects where is store my info and the images Url
    NSURL *myUrl = [NSURL URLWithString:one];


if (listObjects.image) {
cell.myImageView.image = listObjects.image;

} else {

// set default user image while image is being downloaded
cell.myImageView.image = [UIImage imageNamed:@"defaultImage.png"];

// download the image asynchronously
[self downloadImageWithURL:myUrl completionBlock:^(BOOL succeeded, UIImage *image) {
if (succeeded) {

// change the image in the cell
cell.myImageView.image = image;
// cache the image for use later (when scrolling up)
listObjects.image = image;
}

}];

}


return cell;


}

请检查我的代码,我需要添加任何内容吗? 感谢

2 个答案:

答案 0 :(得分:0)

有许多解决方案可以解决这个问题。最好的方法是使用AFNetworking加载图像。你可以在这里找到github项目:https://github.com/AFNetworking/AFNetworking
只需复制" AFNetworking"文件夹到您的项目以及" UIKit + AFNetworking"文件夹副本" ImageView + AFNetworking.h"和#34; ImageView + AFNetworking.m" (您也可以将AFNetworking与UIKit的许多其他元素一起使用" 然后导入" ImageView + AFNetworking.h"到你的班级

#import "UIImageView+AFNetworking.h"

要加载图片,请在- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath方法中添加,请使用:

[cell.myImageView setImageWithURL:myURL placeholderImage:nil];

答案 1 :(得分:0)

如果它对您可行,我会在加载tableview之前加载数组中的所有图像。

在我看来,talbeview仅用于显示数据,而不是获取数据(这是在这里做的)。

不要使用NSStrings对象的数组,而是创建自定义对象类并为其提供一个好名称和一些您需要的属性。例如:

Student是我的类,继承自NSObject

其属性是

@property (weak, nonatomic) NSString *name;
@property (weak, nonatomic) NSString *school;
@property (weak, nonatomic) int *age;
@property (weak, nonatomic) UIImage *picture;

完成后,创建一个方法,在线加载您需要的所有数据,并从中创建自定义对象。我正在跳过所有下载部分,因为你可能知道这一点。如果不这样做,使用AFNetworking确实是一个好主意,正如Georgio的另一个答案所示。

我在很长一段时间内没有这样做,但这很常见也很简单,它会像UIImage *image = [UIImage imageWithURL:YOURURL];或imageWithData这样简单,而你的数据来自你从网址获得的东西......

无论如何,你可以像现在一样获得你的图像数据,就像其他地方一样!然后,使用您在线获取的任何内容创建Student个对象,然后使用这些对象的数组填充您的tableview。一旦你把一切都变得干净整洁,请致电

[tableview reloadData];

和您的cellForRow

Student *student = [myArrayOfFetchedData objectAtIndex:indexPath.row];
cell.image       = student.image;
cell.title       = student.name;
cell.subtitle    = student.school;
return cell;

您可以/应该完全使用自定义单元格来更合适地显示您的特定数据。这是另一个问题和另一个教程。

通过这样做,您将确保:

  • 在加载桌面视图之前加载所有照片
  • 没有任何噱头/滞后/故障,因为我们总是处理相同的目标。

在cellforrow中执行asynch工作只会引发麻烦,并会破坏用户的体验。