2016-08-18 14 views
-1

クラウドキットを使用してTwitterなどのアプリを作成していますが、アプリをリフレッシュまたは再起動するまで問題なく動作します。エラーはありませんが、フィードは空になり、すべてのデータが失われます。複数のユーザーがアプリを使用しているときに何が起こるかを確認しようとはしていません。 CloudKitデータベースに書き込ま更新または再起動後にフィードがすべて失われる

class SweetsTableViewController: UITableViewController { 
    var sweets = [CKRecord]() 
    var refresh: UIRefreshControl! 
    override func viewDidLoad() { 
     super.viewDidLoad() 
     refresh = UIRefreshControl() 
     refresh.attributedTitle = NSAttributedString(string: "Pull to Refresh") 
     refresh.addTarget(self, action: "loadData", forControlEvents: .ValueChanged) 
     self.tableView.addSubview(refresh) 
     loadData() 
    } 
    func loadData() 
    { 
     sweets = [CKRecord]() 
     let publicData = CKContainer.defaultContainer().publicCloudDatabase 
     let query = CKQuery(recordType: "Beam", predicate: NSPredicate(format: "TRUEPREDICATE", argumentArray:nil)) 
     query.sortDescriptors = [NSSortDescriptor(key:"creationDate", ascending: false)] 
     publicData.performQuery(query, inZoneWithID: nil) { (results: [CKRecord]?, error: NSError?) -> Void in 
      if let sweets = results 
      { 
       self.sweets = sweets 
       dispatch_async(dispatch_get_main_queue(), {() -> Void in 
        self.tableView.reloadData() 
        self.refresh.endRefreshing() 
       }) 
      } 
     } 
    } 
    @IBAction func sendSweet(sender: AnyObject) 
    { 
     let alert = UIAlertController(title: "New Beam", message: "Type a Beam", preferredStyle: .Alert) 
     alert.addTextFieldWithConfigurationHandler { (textField: UITextField) in 
      textField.placeholder = "Your Beam" 
     } 
     alert.addAction(UIAlertAction(title: "Send", style: .Default, handler: {(action: UIAlertAction) -> Void in 
      let textField = alert.textFields!.first! 
      if textField.text != "" 
      { 
       let newBeam = CKRecord(recordType: "Beam") 
       newBeam["content"] = textField.text 
       let publicData = CKContainer.defaultContainer().publicCloudDatabase 
       publicData.saveRecord(newBeam, completionHandler: {(record:CKRecord?, error: NSError?) -> Void in 
        if error == nil 
        { 
         dispatch_async(dispatch_get_main_queue(), {() -> Void in 
          print("Beam saved") 
          self.tableView.beginUpdates() 
          self.sweets.insert(newBeam, atIndex: 0) 
          let indexPath = NSIndexPath(forRow: 0, inSection: 0) 
          self.tableView.insertRowsAtIndexPaths([indexPath], withRowAnimation: .Top) 
          self.tableView.endUpdates() 
         }) 
        }else{ 
         print(error) 
        } 
       }) 
      } 
     })) 
     alert.addAction(UIAlertAction(title: "Cancel", style: .Cancel, handler: nil)) 
     self.presentViewController(alert, animated: true, completion: nil) 
    } 
    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
    } 
    override func numberOfSectionsInTableView(tableView: UITableView) -> Int { 
     return 1 
    } 
    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
     return sweets.count 
    } 
    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
     let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) 
     if sweets.count == 0 
     { 
      return cell 
     } 
     let sweet = sweets[indexPath.row] 
     if let sweetContent = sweet["content"] as? String 
     { 
      let dateFormat = NSDateFormatter() 
      dateFormat.dateFormat = "MM/dd/yyyy" 
      let dateString = dateFormat.stringFromDate(sweet.creationDate!) 
      cell.textLabel?.text = sweetContent 
      cell.detailTextLabel?.text = dateString 
     } 
     return cell 
    } 

答えて

1

レコードは常にすぐにクエリ(CKQuery/CKQueryOperation)で返されていません。

クエリインデックスは非同期的に更新されるため、最新のものであるとは限りません。最近変更したレコードを照会し、その変更を処理するのに十分な時間がない場合は、照会の結果が正しくない可能性があります。結果に正しいレコードが含まれていない可能性があり、レコードの順序が間違っている可能性があります。

参考:CKQueryOperation

あなたは、データベースの変更が発生したときに通知を受け取るためにCKSubscription/CKQuerySubscription(iOS版を10+)を使用して調査する必要があります。

関連する問題