今天我有一个读取 plist 站点的应用程序,但它会像这样工作吗:
当您打开应用程序时,它会检查用户是否已经在设备上拥有 plist 以及是否是最新版本。
如果您没有或没有,它是服务器捕获的最新版本
http://lab.vpgroup.com.br/aplicativos/teste-catalogo/lista.plist
我怎么能这样做?我在 stackoverflow 上看到了很多问题,但没有一个能满足我的需要。
谢谢
今天我有一个读取 plist 站点的应用程序,但它会像这样工作吗:
当您打开应用程序时,它会检查用户是否已经在设备上拥有 plist 以及是否是最新版本。
如果您没有或没有,它是服务器捕获的最新版本
http://lab.vpgroup.com.br/aplicativos/teste-catalogo/lista.plist
我怎么能这样做?我在 stackoverflow 上看到了很多问题,但没有一个能满足我的需要。
谢谢
你永远不想阻止用户界面。下载可能需要很长时间。因此在后台进行。最简单的是使用 NSURLConnection 的便捷方法sendAsynchronousRequest:request
顾名思义,它是异步的,下载完成时调用传递过来的完成块
NSURL *url = [NSURL URLWithString:@"http://lab.vpgroup.com.br/aplicativos/teste-catalogo/lista.plist"];
NSURLRequest *request = [NSURLRequest requestWithURL:url];
[NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
NSDictionary *dict = [NSPropertyListSerialization propertyListFromData:data mutabilityOption:0 format:0 errorDescription:nil];
NSLog(@"%@", dict);
}];
样本:
#import <Foundation/Foundation.h>
int main(int argc, char *argv[]) {
@autoreleasepool {
NSURL *url = [NSURL URLWithString:@"http://lab.vpgroup.com.br/aplicativos/teste-catalogo/lista.plist"];
NSURLRequest *request = [NSURLRequest requestWithURL:url];
[NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
NSDictionary *dict = [NSPropertyListSerialization propertyListFromData:data mutabilityOption:0 format:0 errorDescription:nil];
NSLog(@"%@", dict);
}];
//just for demo
[[NSRunLoop currentRunLoop] run];
}
}
您可以对路径进行 HEAD 调用,并获取将存储在设备上的 Etag,如果保存在设备上的 etag 不等于服务器发送的 etag,则下载文件,存储新的 Etag 并覆盖设备文件。您也可以使用 Last-Modified: 标头,但 etag 可能是最好的。您可能需要在服务器上启用实体标签。
为澄清起见,HEAD 仅发送文件的标题,因此通常比发送整个文件进行比较要轻得多。
这就是浏览器管理静态文件和 url 的本地缓存的方式,在这种情况下,浏览器发送它们的 Etag 并且浏览器返回 304 未修改,因此您还可以考虑重现发送存储的 etag 的这种协议并让浏览器返回文件或 304 标头。
我只是在回答你可以使用什么策略,而不是你如何实现、同步或异步,这取决于它所使用的上下文。
我的建议是按照上面 Diaj-Djan 的建议向 NSOperationque 添加请求。
回答你如何做到这一点:有几种方法可以实现:
选项 1:如果您可以向 plist 文件添加一个属性,可以说是版本,如果您可以公开一个向您发送版本号的服务。其他选项 2。第一次您将明显下载 plist 文件并以您希望的方式将版本保存在您的设备上。在随后的下载中-->首先检查设备中的持久版本,看看服务器中是否有来自暴露服务的新版本-->如果是-->进行服务调用以获取 plist 文件-->否则使用设备中的那个。这样,您每次下载 plist 时都可以节省大量时间/数据下载(特别是如果它很大)
选项2:你每次都打一个服务调用,获取plist文件,比较属性,看看有没有变化。虽然这不是一个好的选择,但它很耗时,需要大量处理。
我使用了@ daij-Djan 在上面创建的基础,效果很好。像这样:
在我的。h #导入
@interface ViewController : UIViewController{
NSArray *paths;
NSString *documentsDirectory;
NSString *myPathDocs;
NSFileManager *fileManager;
NSString *filePath;
NSString *documentsPath;
NSURL *url;
}
在我的。米
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
documentsDirectory = [paths objectAtIndex:0];
//filename that will save in device
filePath = [documentsDirectory stringByAppendingPathComponent:@"lista.plist"];
[self showData];
[self updatingData];
}
- (void) updatingData {
NSLog(@"updating Data");
url = [NSURL URLWithString:@"http://lab.vpgroup.com.br/aplicativos/teste-catalogo/lista.plist"];
NSURLRequest *request = [NSURLRequest requestWithURL:url];
[NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
NSDictionary *dict = [NSPropertyListSerialization propertyListFromData:data mutabilityOption:0 format:0 errorDescription:nil];
NSLog(@"%@", dict);
@try {
[dict writeToFile:filePath atomically:YES];
NSLog(@"Saved!! path: %@", filePath);
}
@catch (NSException *exception) {
NSLog(@"Error writing. Erro: %@", [exception description]);
}
[self showData];
}];
}
- (void) showData {
NSString *pathFinal = filePath;
if (![[NSFileManager defaultManager] fileExistsAtPath:filePath])
{
// if failed to get the plist server uses the local built
pathFinal = [[NSBundle mainBundle] pathForResource:@"lista" ofType:@"plist"];
}
NSDictionary *dict = [[NSDictionary alloc] initWithContentsOfFile:pathFinal];
NSLog(@"data displayed: %@", dict);
}