2016-10-27 32 views
11

Önemli hatayı alıyorum: "if (NSKeyedUnarchiver.unarchiveObject(with: loadedData as! Data) as? CKRecord) != nil" satırında 'NSTaggedPointerString' türünde '' NSData '' türünde bir değer verilemedi.CloudKit Kayıtlarının Değiştirilmesiyle İlgili Sorun

Başka önemli bir hata daha var: "Varsayılan konum kaydedicisini kaydetmeyi denediğimde" "locationAppDavaları/NSNserDefaults/CFPreferences değeri olarak konumlandırılmadı."

if let loadedData = defaults1.object(forKey: "locationData") as? Data { 
       let litt = NSKeyedUnarchiver.unarchiveObject(with: loadedData) as! CKRecord 
       let publicDB = CKContainer.default().publicCloudDatabase 
        publicDB.fetch(withRecordID: litt.recordID ,completionHandler: { 
         (record, error) in 
         if error == nil 
         { 
          publicDB.delete(withRecordID: (record?.recordID)!, completionHandler: { 
           (record, error) in 
           if(error == nil){ 
            print("old record delete") 
            let id = self.locationRecord.recordID.recordName 
            self.locationRecord.setObject(locations, forKey: "location") 
            self.defaults1.set(id, forKey: "locationData") 
            self.updateLocationRecord(locations: locations) 
           } 
           else{ 
           } 
          }) 
         }else{ 
          print("Error fetching previous record") 
          } 
        }) 
       } 
     } 
    } 
+0

Sen varolan kaydını sorgulamak ve güncellemek zorunda: Burada

var locationRecord = CKRecord(recordType: "location") func getRecordToUpdate(_ locations:CLLocation) { if defaults1.object(forKey: "locationData") == nil{ locationRecord.setObject(locations, forKey: "location") defaults1.set(locationRecord, forKey: "locationData") self.updateLocationRecord(locations: locations) }else{ if let loadedData = defaults1.object(forKey: "locationData") { print("continue") if (NSKeyedUnarchiver.unarchiveObject(with: loadedData as! Data)) != nil { let publicDB = CKContainer.default().publicCloudDatabase publicDB.fetch(withRecordID: locationRecord.recordID,completionHandler: { (record, error) in if error == nil { publicDB.delete(withRecordID: (record?.recordID)!, completionHandler: { (record, error) in if(error == nil){ print("old record delete") self.locationRecord.setObject(locations, forKey: "location") self.defaults1.set(self.locationRecord, forKey: "locationData") self.updateLocationRecord(locations: locations) } else{ } }) }else{ print("Error fetching previous record") } }) } } } } func updateLocationRecord(locations: CLLocation) { locationRecord.setObject(locations, forKey: "location") let publicData = CKContainer.default().publicCloudDatabase publicData.save(locationRecord, completionHandler: { record, error in }) if error == nil { print("Location saved") } } 
rmaddy

+0

Kullanıcıların, alınıp alındığını kaydettiğinden nasıl emin olabilirim? @rmaddy – Steve

+0

'location' kayıt türünüzün uygun alanlara ihtiyacı var. Şu anda sadece bir 'konum 'alanına sahipmişsiniz gibi görünüyor. Yani sahip olduğunuz tek şey sadece bir 'CLLocation' alanıyla bir "konum" kaydı. Belirli bir kaydın ne için olduğunu bilmenin bir yolu yok. – rmaddy

cevap

4

benim için çalışıyor sona erdi kodudur. Her seferinde yeni bir "CKRecord" oluşturuyorsunuz.