2016-07-30 68 views
-1

我有一个项目,可以在Parse中查找对象作为Array,并在应用程序启动时获取它。但是当没有网络连接时它不能获取信息,所以我想使用NSUserDefaults,并首先将数据保存到NSUserDefaults并在离线时从NSUserDefaults中获取。 有人能给我一个逻辑的例子吗?如何从Parse中脱机时获取NSUserDefaults中的数据

这是我写的代码,我不知道如何在离线时获取它。 我想要从Parse附加数据的数组将是[[String]]。

let userDefaults = NSUserDefaults.standardUserDefaults 
    let query = ClassSub.query() 
    query.whereKey("nameOfData", containsString: "testString") 
    query!.findObjectsInBackgroundWithBlock { (busObjects: [PFObject]?, error: NSError?) -> Void in 
     if error != nil { 
      print(error) 
     } 
     for object in testObjects! { 
      let testData = object["arrayData"] as? [[String]] 
      for i in 0..<testData!.count {testData 
       testArrayappend(testData![i]) 
       self.userDefaults.setObject(NSKeyedArchiver.archivedDataWithRootObject(testData[i]), forKey: "test-time") 
      } 
     } 
    } 

在解析数据类型为[[字符串]],它看起来像[[ “一”, “二”],[ “一”, “三”],[ “一个”,“四“]]

+2

请阅读文档(https://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Classes/NSUserDefaults_Class/)并发布您尝试过的内容。 – Avt

+0

我不是说我不知道​​如何从NSUSedefaults获取数据,我是在谈论离线时的逻辑 – yanamstyle

回答

1

我认为你最好使用解析ios SDK本地数据存储。本地数据存储允许您将解析对象固定到本地数据库,然后当您不在网络中时,仍然可以从本地数据库获取数据。另一个巨大的优势是saveEventually功能,它允许您在离线状态下保存对象,并在您上线后立即将其同步回服务器。

为了使用本地数据存储功能,你需要做以下步骤:

  1. 在解析配置

    let configuration = ParseClientConfiguration { 
        $0.applicationId = "{PARSE_APP_ID}" 
        $0.server = "http://localhost:1337/parse" 
        $0.localDatastoreEnabled = true 
    } 
    
    Parse.initializeWithConfiguration(configuration) 
    
  2. 启用本地数据存储,如果想从查询本地数据存储(在离线状态下),只需在调用findObjectsInBackground之前调用其他函数,以便代码如下所示:

    let query = PFQuery(className: "MyParseObjectClassName") 
    
    // if you are in offline mode then make sure the query 
    // will access your local data store and not to the server 
    if (offlineMode){ 
        query.fromLocalDatastore() 
    } 
    
    query.findObjectsInBackgroundWithBlock { 
        (objects: [PFObject]?, error: NSError?) -> Void in 
    
    
    
        // do something with the result 
    
    
    } 
    
  3. 当您使用本地数据存储时,您需要固定从服务器获取的对象。为了固定对象,只需调用PFObject下存在的pinInBackground()即可。您还可以在一次调用中使用pinAllInBackground()将多个对象固定到本地数据存储区。为了针你的对象,请执行以下操作:

    let query = PFQuery(className: "MyParseObjectClassName") 
    
    // if you are in offline mode then make sure the query 
    // will access your local data store and not to the server 
    if (self.offlineMode){ 
        query.fromLocalDatastore() 
    } 
    
    query.findObjectsInBackgroundWithBlock { 
        (objects: [PFObject]?, error: NSError?) -> Void in 
    
        if (!self.offlineMode){ 
         // pin all objects 
         PFObject.pinAllInBackground(objects) 
    
    
         // pin only first object 
         let obj = objects?.first 
         obj?.pinInBackground() 
        } 
    
    } 
    

现在,为了知道当你离线或在线我建议你使用Reachability库。 此库为您提供了两个区块:在线时和在线时。使用这些块可以确定您的应用程序何时连接到互联网以及何时不连接。因此,当它未连接到互联网时,您需要将offlineMode标志设置为true,从现在开始,所有查询都将对您的本地数据库起作用,否则它将对您的服务器起作用。

+0

感谢您的简洁解释。但我宁愿不要依赖Parse,因为它即将在明年结束。有什么理由不推荐使用NSUseDefaults? – yanamstyle

+0

HI @yanamstyle根据您使用的代码解析iOS SDK。如果你真的不想依靠解析,你应该在解析REST API的基础上创建一个抽象层,而不是使用解析SDK,除非你在幕后做某种映射工作。此外,解析正在关闭,但他们解析。com代码并将其作为一个称为parse-server的开放源代码发布。解析服务器可以部署到任何云提供商,并包含parse.com的所有功能,如果您想要,可以将其用作解决方案或作为临时解决方案,直到您开发自己的后端。 –

+0

对不起,没有研究,但这是解析本地数据存储可用,即使解析服务器将是一个开源?我听说很少的选项在服务结束后将不可用,即使它是开源的 – yanamstyle

相关问题