2015-01-15 22 views
5

Ağ bağlantısı olmadan bir PFObject kaydetmeye çalıştığımda, yerel ağa başarıyla yeniden başladığımda, ağ bağlantısını kullanarak uygulamayı yeniden başlattığımda, nesnenin sunucuya kaydedileceği anlaşılıyor. ama tüm parametreler boş.Parse saveEventual nesnesini kaydeder

Aşağıdaki yordamı yapıyorum, önce farklı değerler içeren bir PFObject oluşturun ve saveEventually numaralı telefonu arayın. Bu adımlar sırasında internet bağlantım yok (uçak modu açık), bu nedenle sunucuya kaydedilemez ve yerel olarak kaydedilmiş.

PFObject *contact = [PFObject objectWithClassName:@"Contact"]; 
[contact setObject:[PFUser currentUser] forKey:kRelatedToUserKey]; 
[contact setObject:self.firstname forKey:kFirstnameKey]; 
[contact setObject:self.lastname forKey:kLastnameKey]; 

[contact saveEventually]; 

Şimdi, uygulamayı kapatıyorum ve yeniden başlatıyorum, kişileri bu şekilde yüklüyorum. Ben uçak modunu kapatarak olduğumda, Şimdi vb ad, soyadı için tüm doğru değerle doğru nesneyi,

PFQuery *postQuery = [PFQuery queryWithClassName:@"Contact"]; 
[postQuery whereKey:@"related_to_user" equalTo:[PFUser currentUser]]; 
[postQuery fromLocalDatastore]; 
[postQuery findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) { 
    if (!error) { 
     // here I get back the correct object from local storage, with all values 
    } 
}]; 

geri alıyorum, bu sunucuya nesneyi kaydetmek için çalışır, ancak tüm Arka ucunda hiç değer olmayan bir nesne olduğunu görebiliyorum. Yerel olarak kaydedilmiş nesne Oysa

enter image description here

hepsi doğru değerleri vardır.

+0

PFObject'e hiçbir parametre veya değer ayarlamamışsınızdır. Sadece nereye gittiğini ve daha sonra sabitlediğini belirtin. Değerlerinizi veya anahtarlarınızı ekleyin – soulshined

+0

@soulshined ipucu için teşekkürler, cevabımı kısaltmaya çalıştım ve bir kopyala yapıştırın. – gpichler

cevap

0

Bu hata şimdi Ayrıştırma sürümü 1.6.3 sabittir!

1

Peki tam olarak ne yapmaya çalışıyorsunuz? İşte nasıl okunuyor:

'Contact' sınıfını sorguladığınızda ve bir nesneyi sorguladıktan ve bir nesnenin kimliğine göre bulduğunda (bir nesne ile bir şey yapmazsınız [PFObject *contact]) daha sonra tamamen farklı bir PFObject oluşturursunuz. Sınıf?? Sadece bir PFObject göndermek istiyorsanız, ancak bu soruyla alakalı olmayan başka bir kodu atlamış olabilirsiniz. Ama tamam. Sorunuza cevap vermek için saveEventually yerel veri deposuyla el ele çalışır, böylece görebildiğiniz gibi, herhangi bir sorunla karşılaşmamalısınız, ancak çağrılan değerler, objectID gibi kaydedilmiyor. ObjectID otonom olarak oluşturulur, bu yüzden kurtarılır ve başka bir şey olmaz. Hatanızı mümkün olan her şekilde çoğaltmaya çalıştım ama yapamıyorum, senin değerlerin, onlar da geri dönüyorlar. Makroları da kullandım (anahtarların nasıl ayarlandığına benziyor), benzetilmiş uçak modu vb. Doğrulamak, sabitlenmiş nesneyi sorgulamak ve ne döndüğünü görmek için. Eklemek denemek için bir geri arama yaptığınızda Ayrıca, en iyisi bir explicity iyi uygulama için sırasıyla onu tanımlayan deyimi veya anahtar durumu ise:

{ 
    if (succeeded) { 
     debt.parseID = newDebt.objectId; 
    }]; 
}]; 

Dahası, önemli çünkü başarı bloğunda temel görevleri koyarken dikkatli olun saveEventually öğesi, uygulama sonlandırılmadan önce tamamlanmıyorsa ve nesne hala bellekte ise, tekrar deneyecektir, ancak nesne artık bellekte değilse, sonraki çalışma zamanını tekrar deneyecektir, ancak OLMADAN başarı bloğu.

sizin özellik değerlerini giderme nasıl bu


Biz orijinal yayından uzun bir yol kat ettik tanımlıyorsanız (self.contact | | self.amount self.incomingDebt), çabasıyla bu yüzden deneyin ve geri getirin, gerçek ve sadece sorun burada saveEventually.

Parse şu anda erişilemiyor olsa bile, bu nesneyi gelecekte belirtilmemiş bir zamanda sunucuya kaydeder.

saveEventually ana niyet:

bunu kullanın Eğer sağlam bir ağ bağlantınız olmayabilir ve tasarruf

Eğer tamamlandığında bilmek gerekmez zaman 10MB'den fazla veri gönderilmeyi bekliyor, daha sonra yapılan çağrılar bağlantı kurulabilene kadar eski kayıtların sessiz bir şekilde atılmasına neden olacak ve sıraya konulan nesneler kaydedilebilecektir. Bu çağrıldığında kontrolün üzerinde hiçbir denetiminiz yoktur. Ek olarak, kaydetme başarılı bir şekilde yüklenene kadar yerel diskteki verileri önbelleğe alır, böylece aynı nesnenin sabitlenmesi gereksizdir. Sonunda tasarruf ederseniz, bunun hakkında bir düşünürseniz, yerel bir veri deposudur, internet kullanılabilir olana kadar bunları yerel diskte depolar (yerel veri deposu)

Bunu önlemek için iki yolunuz vardır. Yerel veri deposu, kullanıcıların basit bir tek kodlu pin/pinInBackground: ile NSFRC'den çıkmasını sağlayan bir çekirdek-veri-esque özelliğidir. Nesneleri kolayca bağlayabilirsiniz ve internete tekrar kavuştuğunuzda tekrar sabitleyiniz ve arka ucunuza kaydedebilirsiniz. Alternatif olarak bunu başka bir şekilde yapabilir, hemen ulaşılabilirliği arayabilir ve ilk pin: internet varsa, saveInBackground: önce. Ya da sadece önbellekleme politikalarından yararlanın.


REFERANSLAR:

+0

Cevabınız için çok teşekkür ederim, yardımlarınız için gerçekten minnettarım. Bütün cevabımı güncellemek için biraz zamanım vardı ve umarım artık biraz daha açık. Hala aynı problemim var. – gpichler

+0

@ user1463853 Yeni gözden geçirilmiş sorunuzda yazım hatası var mı? [newContact saveEventually]; PFOBject'inizi yaratmanıza * ad verilmiyor * contact not * newContact. Bunun yerine: '[kontak kaydetmeEvde]; – soulshined

+0

Bu benim bir yazım hatasıydı, kodumda doğru referansı kullanıyorum. (Sorunu giderildi) – gpichler

0

Ben benzer bir sorun vardı, ben aslında kaldırma veya değil [Parse enableLocalDatastore]; arayarak sonuçlandığını tespit Exp olarak performans gösteren saveEventually Seçilen (Parse 1.6.2'yi kullanarak). Bunun çalışması için [Parse enableLocalDatastore];'un gerekeceğini varsaymıştım.

+0

Aynı şey. DataStore kullanıyorsak SaveEventually() çalışmıyor. Bir çözümün var mı? – VipulKumar

İlgili konular