【问题标题】:What is the most efficient method to store images and data on an iPhone app from the web?从网络上将图像和数据存储在 iPhone 应用程序上的最有效方法是什么?
【发布时间】:2012-07-13 13:45:17
【问题描述】:

我会尽量保持简短。我正在为 iPhone 制作一个应用程序,该应用程序需要能够存储来自网络的一些图像。图像的 URL(以及其他数据)存储在 MySQL 服务器的一个表中。从那里,我用 JSON 解析了表格,并成功地将其序列化以显示在应用程序的 UITableView 中。每个单元格现在显示来自表中 imageurl 字段的图像,以及来自表中标题字段的图像标题作为文本,两者都来自 MySQL->json.php->NSArray(json)(objectAtIndex)等等

此时,应用程序每次启动时,它都会从带有 JSON.php 的 url 中获取所有信息,并且我认为它每次都会下载图像。我觉得这比必要的工作多得多,但是,由于数据库会根据其获取数据的位置不定期地更新自身,因此仅下载一次信息是不够的。

问题 1: 我需要一个解决方案,应用程序“询问”.php 是否具有与 JSON 显示的完全相同的数据。我能想到的最合乎逻辑的方法是在 .php 中为“日期”添加一个字段,显示上次更新数据的日期,如果应用程序有来自同一日期的数据,则不会发生任何事情,但如果 php-端日期比应用端日期新,那么它必须能够删除所有存储的数据,并替换为新的 JSON 数据。

问题 2: JSON-data 是 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;

}

斯蒂安。

【问题讨论】:

    标签: php iphone ios image storing-data


    【解决方案1】:

    以防有人读到这个。例如,当制作一个 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];
    });
    

    【讨论】:

    • 你是对的。我会通过再次使用 GCD 进行 fetchedData 回调来进一步清理它。我尝试尽可能使用 GCD 而不是 performSelect,因为在不同线程上执行不同操作时它更容易阅读并且更明显。 dispatch_async(kBgQueue, ^{ NSData *data = [NSData dataWithContentsOfURL:JSONURL]; dispatch_sync(dispatch_get_main_queue(), ^{ [self fetchedData:data]; }); });编辑:对不起,多行代码标签似乎在 cmets 中不起作用。 ://
    【解决方案2】:

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

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

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

    【讨论】:

    • 呃.. 嗯,这基本上就是我所拥有的:#define kURL [NSURL URLWithString:@"www.example.com"] NSData* data = [NSData dataWithContentsOfURL: kURL]; NSArray *json = [NSJSONSerialization JSONObjectWithData:数据选项:NSJSONReadingMutableContainers 错误:&e]; NSDictionary *info = [json objectAtIndex:indexPath.row]; cell.textLabel.text = [info objectForKey:@"Name"]; // ± url 也一样 我应该切换到别的东西吗?
    • 你在哪里创建单元格?
    • 对不起,这是一种礼貌的说法,您需要发布超过四行代码。您甚至没有向我展示您是如何分配表格视图单元格的。
    • 但是这种滚动滞后不是我的主要问题。关于你所说的这个 NSURLRequest。你觉得我应该换掉一些东西吗?
    • 是的。使用异步 URL 请求并在加载时将图像设置为占位符图像。那应该摆脱您的断断续续的滚动。学习 NSURLRequest 和 NSURLRequestDelegate
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-05
    • 2013-07-22
    • 1970-01-01
    • 2017-01-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多