Steve
Steve

Reputation: 1153

Deleting CKRecord from Cloudkit in swift

I am trying to have the users' location be updated by this function. Originally it was saving the users' location every time, but I added the code that will be below the comment. How can I make sure the record that is being deleted is the old location?

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)
    }

Upvotes: 1

Views: 513

Answers (1)

mginn
mginn

Reputation: 16104

The best way to do this would be to update the existing one, as @Michael pointed out. The easy way to do this would be the first time you create the record, save the recordID to the defaults. For example,

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")
          }
      }
  }
}

Create a new function,

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
}

Then in the original locationManager method, take out everything and put

self.getRecordsToUpdate(locations)

Upvotes: 1

Related Questions