我会尽量保持简短。我正在为 iPhone 制作一个应用程序,它需要能够存储来自网络的一些图像。图像的 URL(以及其他数据)存储在 MySQL 服务器的一个表中。从那里,我用 JSON 解析了表格,并成功地将其序列化以显示在应用程序的 UITableView 中。每个单元格现在显示来自表中 imageurl 字段的图像,以及来自表中标题字段的图像标题作为文本,两者都来自 MySQL->json.php->NSArray(json)(objectAtIndex)等等
此时,应用程序每次启动时,它都会从带有 JSON.php 的 url 中获取所有信息,并且我认为它每次都会下载图像。我觉得这比必要的工作量要大得多,但是,由于数据库将根据其获取数据的位置不定期地更新自身,因此仅下载一次信息是不够的。
问题 1:我需要一个解决方案,应用程序“询问” .php 是否具有与 JSON 显示的完全相同的数据。我能想到的最合乎逻辑的方法是在 .php 中为“日期”添加一个字段,显示数据上次更新的日期,如果应用程序具有同一日期的数据,则不会发生任何事情,但如果 php-端日期比应用端日期新,那么它必须能够删除所有存储的数据,并替换为新的 JSON 数据。
问题 2:JSON 数据是 iPhone 中的 NSArray,“Image”字段只是图像的 url (www.example.com/image.png),而不是实际图像。在通过 JSON 获得数据的新“版本”之前,如何下载这些图像并将它们保存在 iPhone 上?
奖励问题:我现在使用的方法是在滚动时使 UITableView 滞后。我不是专业人士,但我已经阅读了几个地方,这可能是由内存泄漏引起的,我还没有完全理解这意味着什么。我还读到这可能是因为我可能会为每个单元格实例化对象,而不是一次并重新使用它。
底线:我的目标是让应用程序在第一次应用程序启动时从 json.php 下载所有数据,然后在以后启动时检查版本是否正确。如果正确,则无需下载,只需使用存储的包含数据的 JSON 对象,并且来自 url 的图像文件下载第一次启动。如果不正确,请删除所有以前存储的图像并清除 json-object,然后导入新更新的 json-object,并从 iPhone 上某个 jsonobject 的 image-urls 中保存图像。
注意:更新数据(即添加一个额外的图像,这就是所做的所有更改)不是解决方案,在我看来也不可能。当这个数据库有更新时,我需要清除手机中存储的所有信息,然后重新下载。这是因为我放入数据库的信息是从另一个网站解析的,如果新图像或数据更新包含其他字段的更改,那么我宁愿调整数据库以适应(通过 json.php)而不是一直发布应用程序的更新。
这是错误的方法吗?这可能吗?非常感谢您的帮助!
从这里和那里编辑 JSON 的东西..
#define kURL [NSURL URLWithString:@"www.example.com"]
NSData* data = [NSData dataWithContentsOfURL: kURL];
NSArray *json = [NSJSONSerialization JSONObjectWithData: data options: NSJSONReadingMutableContainers error: &e];
NSDictionary *info = [json objectAtIndex:indexPath.row];
cell.textLabel.text = [info objectForKey:@"Name"]; // ±Same for url
这是从课堂上不同的地方提取的,所以它们可能不会完全像这样工作。
编辑
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
}
// Configure the cell...
info = [json objectAtIndex:indexPath.row];
cell.textLabel.text = [info objectForKey:@"Name"];
NSString* imageURL = [info objectForKey:@"Image"];
NSURL *URLimage = [NSURL URLWithString:imageURL];
NSData* imageData = [NSData dataWithContentsOfURL:URLimage];
UIImage* images = [[UIImage alloc] initWithData:imageData];
cell.imageView.image = images;
return cell;
}
斯蒂安。