我有一个基于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;
}
请检查我的代码,我需要添加任何内容吗? 感谢
答案 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工作只会引发麻烦,并会破坏用户的体验。