2015-02-10 51 views
1

我建立在iOS的玩具應用程序,用戶可以:iOS版 - API同步

  • 創建任務,本地存儲
  • 這些任務將同步到服務器
  • 創建的任務網頁
  • 他們將同步迴應用

此使用核心數據的所有持久性和Alamofire聯網,在斯威夫特編碼。

我通常這個流程做的是以下幾點:

  1. 上傳新任務
  2. 下載從上游
  3. 同步本地編輯任務

改變這需要所有這些任務是連續執行的,但Alamofire顯然不會執行同步請求。我是iOS編程的新手,我已經讀了一些關於GCD的內容,但我不知道該如何繼續。

要使用簡單的問題說清楚這件事:

  1. 那是同步流量是否正確?
  2. 我應該使用GCD嗎?如果是這樣,怎麼樣?
  3. 有關如何正確執行此操作的任何建議?

回答

1

這是我怎麼會做它(假設你可以改變服務器的代碼):

首先,存儲在本地「同步日期」某處的應用程序。然後,對於每個任務,存儲修改的日期。每當任務被修改時,將修改日期設置爲當前日期。然後,當您想與服務器同步時:

  1. 將在「同步日期」之後修改的所有任務上載到服務器。另外,將「同步日期」發送到服務器。
  2. 服務器響應修改日期在指定同步日期之後的所有任務。
  3. 服務器然後通過上傳的項目並保存它們。
  4. 該應用程序然後保存從服務器下載的所有任務,創建新的或根據需要更新現有的任務...
  5. 然後,應用程序會遍歷從服務器返回的所有項目,查找最新的修改日期。如果最新修改日期晚於應用的「同步日期」,請將「同步日期」設置爲最新修改日期。

對於刪除任務,我會在每個任務上都有一個「已刪除」標誌。當任務被刪除時,它的「已刪除」標誌被設置爲true。它仍然會同步到服務器,但是如果從設置了「已刪除」標誌的服務器下載任務,則應從數據庫中刪除該任務...

GCD

至於GCD,它看起來像Alamofire庫負責的一切給你,所以你並不需要使用它。如果你確實想使用它,它是非常簡單的:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND), ^{ 

    // This code will run in the background, so it doesn't matter 
    // how long it takes, it won't freeze the app... 

}); 

dispatch_async(dispatch_get_main_queue(), ^{ 

    // This code will run on the main thread... 

}); 

它還有更多的功能...

+2

我同意很多,但我會建議存儲本地日期和使用用於查找在服務器上給定日期已更改的記錄,例如在響應客戶端請求「從X獲取記錄」時,服務器將以「從Y開始,這裏是從X開始的所有新記錄」的功能答覆,然後應用程序可以在將來的請求中使用Y.更好的是,根本不使用時間戳,而是使用一些服務器生成的唯一標識符(例如複製標識,或者你有什麼)。這完全消除了較小的時間差異等風險。 – Rob 2015-02-10 14:35:09

+0

偉大的模式。 @Rob,有關複製ID的進一步閱讀?聽起來很有趣 – jlhonora 2015-02-10 17:05:34

+0

這個想法很簡單。讓服務器跟蹤更新的順序,通過更改/修改/刪除日期,某個唯一標識符或某個序號來標識它們。有時候你會在表格中做到這一點。有時你會有一個單獨的更新表(有時由原始表上的觸發器填充)。但是無論使用什麼標識符,都要讓客戶端跟蹤從server_接收到的最後一個標識符,並且在未來某個時刻請求更多更新時,將相同的標識符傳遞迴服務器。 – Rob 2015-02-14 04:57:53