2016-07-30 67 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

相關問題