通过网络在iPhone应用程序上存储图像和数据的最有效方法是什么?

时间:2012-07-13 17:02:24

标签: php iphone ios image storing-data

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

此时,每次App启动时,它每次都会使用JSON.php从URL获取所有信息,我认为它每次都会下载图像。我认为这比必要的工作更多,但是,由于数据库将根据数据的获取位置不规则地更新自己,仅仅下载一次信息就不够了。

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

问题2: JSON数据是iPhone中的NSArray,“Image”字段只是图像的URL(www.example.com/image.png),而不是实际图像。我如何下载这些图像并将其保存在iPhone上,直到通过JSON获得新的“数据版”数据?

奖金问题: 我现在使用的方法是滚动时使UITableView滞后。我不是专业人士,但我已经阅读了几个地方,这可能是由于泄漏记忆造成的,我还没有完全明白这意味着什么。我还读到它可能是因为我可能为每个单元格实例化对象,而不是一次并重复使用它。

底线: 我的目标是让应用程序在第一次应用程序启动时从json.php下载一次所有数据,稍后启动时只检查版本是否正确。如果正确,没有必要下载,只需使用包含数据的存储JSON对象,并从第一次启动下载的网址中获取图像文件。如果不正确,删除所有以前存储的图像并清除json对象,并导入新更新的json对象,并从iPhone上某处的jsonobject中保存图像URL中的图像。

注意:更新数据(即添加一个额外的图像,这是所有已经做出的更改)不是解决方案,在我看来不是这种可能性。当此数据库中有更新时,我需要清除手机中存储的所有信息,然后重新下载全部。这是因为我放在数据库中的信息是从另一个网站解析的,如果新图像或数据更新包含其他某些字段的更改,那么我宁愿调整数据库以适应(通过json.php)而不是一直发布应用程序的更新。

这是错误的做法吗?这可能吗?非常感谢帮助!

EDIT 来自这里和那里的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;

}

了Stian。

2 个答案:

答案 0 :(得分:0)

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

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

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

答案 1 :(得分: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];
});