2016-09-06 4 views
1

私はこの機能によってユーザーの場所を更新しようとしています。もともとは毎回ユーザーの場所を保存していましたが、コメントの下にあるコードを追加しました。削除されるレコードが古い場所であることを確認するにはどうすればよいですか?迅速にCloudkitからCKRecordを削除する

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

を入れて、古いものを削除して更新するのではなく、古いものを削除しますか? – Michael

+0

既存のものをどのように変更すればよいですか? @マイケル – Steve

+1

既存のものへのローカル参照を保持することによって - おそらくNSUserDefaultsにあります。存在しない場合は、初めて保存する必要があることが分かります。それ以外の場合は、既存のレコードをフェッチして更新し、元に戻す必要があります。 docoの "既存のレコードを取得中"の下を見てください - https://developer.apple.com/library/ios/documentation/CloudKit/Reference/CKRecord_class/ – Michael

答えて

1

これを行う最も良い方法は、@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方法で、すべてのものを取り出し、なぜあなたは新しいCKRecordを追加しようとしている

self.getRecordsToUpdate(locations) 
+0

"updateRecord"でエラーが発生しました。どこで定義しましたか? that @milesper – Steve

+0

申し訳ありませんが、あなたがabovdのように位置情報を保存して保存するコードを置く関数です。 – milesper

+0

私はこのコードをどこに置くことをお勧めしますか?それはまだupdateRecordに削除部分を含めるべきですか? @milesper – Steve

関連する問題