2

我会尽量保持简短。我正在为 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;

}

斯蒂安。

4

2 回答 2

0

我假设您正在通过 NSURLRequest 与您的服务器通信。如果是这样,只需将缓存策略设置为 NSURLRequestReloadRevalidatingCacheData ,如果它已经在缓存中并且是最新的,它将不会重新下载您的数据。这样,它几乎可以为您处理。

您还需要在应用程序委托中的某个地方设置一个 NSURLCache。

如果您不发布代码,我无法告诉您是什么导致了您的大块滚动。

于 2012-07-13T17:20:33.500 回答
0

以防有人读到这个。例如,当制作一个 NSURL 来获取(和解析)一个大的 JSON 文件时。您将希望在后台执行此操作 (dispatch_get_global_queue)。然后在需要数据时调用它(dispatch_async)。否则,您将使用与 UI 相同的线程,并且它会在执行任务时冻结..

#define kBgQueue dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)
#define JSONURL [NSURL URLWithString:@"http://www.web.com/json.php"]    
...

dispatch_async(kBgQueue, ^{
    NSData* data = [NSData dataWithContentsOfURL:JSONURL];
    [self performSelectorOnMainThread:@selector(fetchedData:) withObject:data waitUntilDone:YES];
});
于 2012-10-30T17:21:50.447 回答