从未保存的 plist 中读取

Posted

技术标签:

【中文标题】从未保存的 plist 中读取【英文标题】:Reading from an unsaved plist 【发布时间】:2011-03-09 20:30:08 【问题描述】:

我正在开发一个应用程序,它从位于我的网络服务器上的 plist 中检索其数据。因此,应用程序依赖于网络连接。我希望用户能够在离线时使用我的应用程序,因此每次应用程序通过网络连接加载时,我都会在用户设备上保存 plist 的副本。从那里,我从位于设备上的 plist 中读取数据。

不过,我遇到了麻烦。我正在 AppDelegate 的 didFinishLaunchingWithOptions 方法中开始下载数据。这样做是这样的:

if(hasConnection)  // returns TRUE or FALSE based on Apple's example on checking network reachability
        NSLog(@"Starting download of data.");

        // loading using NSURLConnection
        NSURLRequest *theRequest = [NSURLRequest requestWithURL:[NSURL URLWithString:FETCH_URL] cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:60.0];

        // create the connection with the request
        // and start loading the data
        NSURLConnection *theConnection = [[NSURLConnection alloc] initWithRequest:theRequest delegate:self];
        if (theConnection) 
            // Create the NSMutableData to hold the received data.
            // receivedData is an instance variable declared elsewhere.
            receivedData = [[NSMutableData data] retain];
        
    

然后我将数据添加到我的 plist Bands.plist in connectionDidFinishLoading

- (void)connectionDidFinishLoading:(NSURLConnection *)connection 
    // throw data into a property list (plist)
    NSMutableArray *tmpArray = [NSPropertyListSerialization propertyListFromData:receivedData mutabilityOption:NSPropertyListMutableContainers format:nil errorDescription:nil];

    NSMutableArray *plistArray = [[NSMutableArray alloc] initWithArray:tmpArray];

    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];

    NSString *path = [documentsDirectory stringByAppendingPathComponent:@"Bands.plist"];

    [plistArray writeToFile:path atomically:YES];
    [plistArray release];

    // release the connection, and the data object
    [connection release];
    [receivedData release];

但第一次加载应用程序时,它崩溃了。我相信这是由于应用程序试图访问此数据,即使它尚未保存。如果我删除试图访问本地保存的数据的部分,我没有问题。如果我再次添加它并重新启动应用程序(第二次加载),我也没有问题。

有人知道如何解决这个问题吗?

好像我的应用程序试图加载和处理尚不存在的数据。

【问题讨论】:

控制台和调试器告诉你什么 - 你应该能够找出哪条线路崩溃了。 @deanWombourne 我得到了NSInvalidArgumentException', reason: '-[__NSCFDictionary setObject:forKey:]: attempt to insert nil value,我认为这是由于该方法试图处理它没有的信息。有什么方法可以让它“等待”plist 准备好? 为什么不附带一个默认 plist,其中包含足够的应用程序启动。然后应用程序可以开始在后台获取更多数据,同时显示请稍候或类似的东西? (或者你可以试试@Mundi 的想法!) 【参考方案1】:

只需先尝试检查 plist 是否存在:

if ([[NSFileManager defaultManager] fileExistsAtPath:path]) 
   ...  // read the data, etc.

else 
   ...  // don't try to read it

干杯, 萨沙

【讨论】:

非常感谢。如果虚拟文件尚不存在,则复制它似乎可以解决问题。

以上是关于从未保存的 plist 中读取的主要内容,如果未能解决你的问题,请参考以下文章

转基本数据持久性 使用plist保存和读取数据

读取和写入 NSMutableDictionary 到 plist 文件

尝试共享应用程序时 iPhone 代码设计错误(ResourceRules.plist:无法读取资源)

核心数据对象被写入,但从未读取

如何将本地保存的 xml 文件保存到 .plist 文件中

从 plist 读取字典后无法编辑字典