我有一个数据plist(方便地命名为Data.plist
),在启动应用时会更新:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
// Determile cache file path
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *filePath = [NSString stringWithFormat:@"%@/%@", [paths objectAtIndex:0],@"Data.plist"];
NSString *dataURLString = @"http://link/to/Data.plist";
NSURL *dataURL = [[NSURL alloc] initWithString:dataURLString];
NSData *plistData = [NSData dataWithContentsOfURL:dataURL];
[plistData writeToFile:filePath atomically:YES];
NSDictionary *dict = [NSDictionary dictionaryWithContentsOfFile:filePath];
NSLog(@"The bundle is %@", filePath);
self.data = dict;
// Configure and show the window
[window addSubview:[navigationController view]];
[window makeKeyAndVisible];
return YES;
}
我希望能够有一些方法来检查已保存的plist与服务器plist - 我已经看到一些使用外部库的实现,但在原始的iOS SDK中必须有一些东西。有任何想法吗?我已经阅读了我最终使用的所有代码,需要在viewWillAppear
中实现,但我不确定 该代码是什么。
答案 0 :(得分:2)
两件事......首先,dataWithContentsOfURL:
并且通常任何Apple的(诱人方便的)<anything>WithContentsOfURL:
方法在现实世界中极不安全。它是阻止,这意味着在您的请求成功或失败之前,其他任何代码都不会执行。这意味着如果服务器不可用或您的设备没有互联网或由于某些其他原因无法检索您的数据,您的手机将坐在那里直到iOS看门狗进程杀死您的应用程序冻结时间过长,或者它刚刚失败。那么期待数据的应用程序的其余部分将会因为突然您的代码假定您应该没有数据而感到震惊。这是同步请求的许多问题之一。
我不会讨论如何实现异步请求,而是转向Apple的文档,或者您可以使用像http://allseeing-i.com/ASIHTTPRequest/这样的包装器框架来为您完成。另请查看http://www.cocoabyss.com/foundation/nsurlconnection-synchronous-asynchronous/
要回答您的实际问题,您的服务器上可能会有一个带有版本号或时间戳的小文本文件,并与您的plist一起下载。在后续启动时,您可以下拉时间戳/版本号并将其与您存储的版本号进行比较,如果服务器上的版本更新,则将其拉出并保存新的时间戳/版本号