2016-09-06 3 views
1

Я пытаюсь обновить местоположение пользователей этой функцией. Первоначально он сохранял местоположение пользователей каждый раз, но я добавил код, который будет ниже комментария. Как я могу убедиться, что удаляемая запись - это старое местоположение?Удаление CKRecord из Cloudkit в 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) 
    } 
+1

Почему вы пытаетесь добавить новый CKRecord и удалить старый, а не просто сохранить его и обновить? – Michael

+0

Как мне изменить существующий? @michael – Steve

+1

Сохраняя локальную ссылку на существующую, возможно, в NSUserDefaults. Если этого не существует, вы знаете, что вам нужно сэкономить в первый раз, иначе вам нужно извлечь существующую запись, обновить ее и затем сохранить. Посмотрите в разделе «Получение существующей записи» в doco - https://developer.apple.com/library/ios/documentation/CloudKit/Reference/CKRecord_class/ – Michael

ответ

1

Лучший способ сделать это - обновить существующий, как отметил Майкл. Самый простой способ сделать это - это первый раз, когда вы создадите запись, сохраните идентификатор записи по умолчанию. Например,

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) 
+0

. Я получаю сообщение об ошибке «updateRecord», где вы определили что @milesper – Steve

+0

Извините, updateRecord - это функция, в которой вы помещаете код, который хранит и сохраняет информацию о местоположении, как у вас есть abovd – milesper

+0

Где вы предлагаете я поместил этот код? Должна ли она включать часть удаления в updateRecord? @milesper – Steve

Смежные вопросы