正在从 swift 中的 Cloudkit 中删除 CKRecord

Deleting CKRecord from Cloudkit in swift

我正在尝试通过此功能更新用户的位置。最初它每次都是保存用户的位置,但我添加了评论下方的代码。如何确定正在删除的记录是旧位置?

let locationRecord = CKRecord(recordType: "location")

func locationManager(manager: CLLocationManager, didUpdateLocations locations: [CLLocation])
    {
        let location = locations.last
        let center = CLLocationCoordinate2D(latitude: location!.coordinate.latitude, longitude: location!.coordinate.longitude)
        let region = MKCoordinateRegion(center: center, span: MKCoordinateSpan(latitudeDelta: 0.01, longitudeDelta: 0.01))
        self.mapView.setRegion(region, animated: true)
        self.locationManager.stopUpdatingLocation()//
        locationRecord.setObject(location, forKey: "location")
        let publicData = CKContainer.defaultContainer().publicCloudDatabase
        publicData.saveRecord(locationRecord) { record, error in
        }
            if error == nil
            {
                print("Location saved")
                self.loc1 = location!
            }
        //testing code below
        let operation = CKModifyRecordsOperation(recordsToSave: nil, recordIDsToDelete: [locationRecord.recordID])
        operation.savePolicy = .AllKeys
        operation.modifyRecordsCompletionBlock = { added, deleted, error in
            if error != nil {
                print(error)
            } else {
                print("location updated")
            }
        }
        CKContainer.defaultContainer().publicCloudDatabase.addOperation(operation)
    }

正如@Michael 指出的那样,最好的方法是更新现有的。执行此操作的简单方法是在您第一次创建记录时,将 recordID 保存为默认值。例如,

func getRecordToUpdate(locations:[CLLocation])->CKRecord?{
  let defaults = NSUserDefaults.standardUserDefaults()
  var locationRecord:CKRecord

  if defaults.objectForKey("locationRecordID") == nil{
      //Create a new record and save its id
      locationRecord = CKRecord(recordType: "location")
      defaults.setObject(locationRecord.recordID, forKey: "locationRecordID")
      self.updateLocationRecord(locationRecord, locations)
  }else{
      //Fetch the already existing record
      let publicDB = CKContainer.defaultContainer().publicCloudDatabase
      publicDB.fetchRecordWithID((defaults.objectForKey("locationRecordID") as! CKRecordID), completionHandler{
          (record, error) in
          if error == nil{
            self.updateLocationRecord(record, locations)
          }else{
            print("Error fetching previous record")
          }
      }
  }
}

创建一个新函数,

func updateLocationRecord(locationRecord:CKRecord, locations:[CLLocation]){
   //Put your code from "let location..." to just above the testing code
   //You may want to fix the block syntax in the call to saveRecord
}

然后在原来的locationManager方法中,把所有的东西都拿出来放

self.getRecordsToUpdate(locations)