SORU
17 ŞUBAT 2011, PERŞEMBE


Nasıl web sunucusu ile iPhone Core Data Sync, ve diğer cihazlar için itin.

Sync çekirdek veri birden fazla cihaz, bir iPad veya Mac gibi bir iPhone uygulamasında saklanan bir yöntem üzerinde çalışıyorum. Çoğu (hiç değilse) iOS Çekirdek Veri ile kullanmak için sync çerçeveleri yok. Ancak, aşağıdaki kavram düşünüyordum:

  1. Bir değişiklik yerel çekirdek veri deposuna yapılan değişiklik kaydedilir. (a) Eğer aygıt çevrimiçi İse, değişiklik kümesini Gönderen sunucu, aygıtın aygıt KİMLİĞİ de dahil olmak üzere değişiklik kümesini göndermek için çalışır. (b) Eğer değişiklik kümesini sunucu ulaşmak, değil, ya da eğer aygıt çevrimiçi ise, uygulama değişikliği kuyruğa online geliyor zaman gönderecek şekilde ekleyecektir.
  2. Sunucu, bulut içinde otururken, belirli bir değişikliği ana veritabanı ile aldığı setleri birleştirir.
  3. Sonra bir değişiklik kümesini (veya bir sıra değişikliği ayarlar) birleştirilmiş üzerinde bulut sunucu, sunucu iter tüm bu ayarlar değiştirmek için diğer cihazlar kayıtlı olan sunucu kullanarak bir çeşit yoklama sistemi. (Apple Push services, ama galiba yorumlara göre bu uygulanabilir bir sistem değil kullanmayı düşündüm.)

Düşünmek için ihtiyacım olan bir şey fantezi var mı? *, Core Resource *0, RestfulCoreData gibi çerçeveler SONUNA baktım. Tabii ki, bu bağlı değilim hangi Raylar üzerinde Ruby ile çalışıyor, ama başlamak için bir yer. Benim çözüm için temel gereksinimleri vardır:

  1. Herhangi bir değişiklik ana iş parçacığı ara vermeden arka planda gönderilmelidir.
  2. Mümkün olduğunca az bant genişliği olarak kullanmalısınız.

Zorluklar bir dizi düşündüm:

  1. Nesneyi farklı cihazlar üzerinde farklı veri depoları için Kimlikleri emin sunucuda bağlı. Yani, nesne veritabanında saklanan bir başvuru ile bağlı olan nesne Kimlikleri ve aygıt Kimliği, bir tablo olacak. Ben bir kayıt (Databaseİd [benzersiz bu tablo], Objectıd [benzersiz öğeyi içinde tüm veritabanı], Datafield1, Datafield2), Objectıd alan olacak referans bir tablo, AllObjects: (Objectİd, Deviceıd, DeviceObjectİd). Cihaz bir değişiklik kümesi iter zaman, aygıt Kimliği iletmekten ve çekirdek veri objectıd yerel veri deposu nesne. Sonra bulut sunucum AllObjects tabloda objectıd ve aygıt Kimliği karşı kontrol edin, ve ilk tabloyu değiştirmek için kayıt bulacaksınız.
  2. Tüm değişiklikleri birleştirilecek, böylece zaman damgalı olmalıdır.
  3. Cihaz sunucu yoklamak için, çok fazla pil tüketmeden var.
  4. Yerel cihazlar da bir değişiklik sunucudan alındığında ise, bellekte tutulan güncellemek gerekir.

Burada kaçırdığım bir şey var mı? Ne tür çerçeveler bunu mümkün kılmak için bakmak gerekir?

CEVAP
19 ŞUBAT 2011, CUMARTESİ


Bir şey yapmak için çalışıyoruz ne benzer yaptım. Öğrendiğim şeyi ve nasıl yaptığımı size anlatayım.

Sunucuda Çekirdek Veri arasında bire bir ilişki bir nesne ve model (ya da db şema) olduğunu varsayıyorum. Sadece müşterileri ile senkronize sunucu içeriğini tutmak istiyorum, ama müşteriler de ve verileri değiştirmek ekleyebilirsiniz. Eğer doğru anladıysam, o zaman okumaya devam edin.

Senkronizasyon yardımcı olmak için dört alan ekledim:

  1. sync_status- Çekirdek veri modeli için bu alan sadece ekleyin. Eğer öğe üzerinde bekleyen bir değişiklik olup olmadığını belirlemek için uygulama tarafından kullanılıyor. Ben aşağıdaki kodları kullanın: 0 anlamına gelir herhangi bir değişiklik, 1 sunucusuna senkronize olmak için sıraya alınmış demektir, ve geçici bir nesne ve aklanamaz 2 anlamına gelir.
  2. is_deleted- Server ve temel veri modeli için bu ekleyin. Sil olay aslında hiçbir şey seni geri eşitlemek için bırakır çünkü istemci modeli veritabanından veya bir satır silmek gerekmiyor. Bu basit boolean bayrak alarak, 1, eşitlemek için is_deleted ayarlayabilirsiniz, ve herkes mutlu olacak. Ayrıca sunucu üzerinde kod değiştirme ve sigara Silinmiş Öğeler sorgusu için müşteriyle gerekir "=0 is_deleted".
  3. last_modified- Server ve temel veri modeli için bu ekleyin. Bu alan otomatik olarak her şeyi kayda değiştiğinde sunucu tarafından geçerli tarih ve saati ile güncellenmelidir. Asla Müşteri tarafından değiştirilmiş olmalıdır.
  4. guıd- Server ve temel veri modeli için genel benzersiz kimliği (http://en.wikipedia.org/wiki/Globally_unique_identifier) bir alan ekleyin. Bu alan, birincil anahtar olur ve istemci üzerinde yeni kayıtlar oluştururken önemli hale gelir. Normalde birincil anahtar sunucu üzerinde artan bir sayıdır, ama içeriği çevrimdışı ve daha sonra senkronize yaratılmış olabileceğini akılda tutmak zorundayız. GUID bizi çevrimdışı olurken bir anahtar oluşturmanızı sağlar.

Müşteri, kodu bir şeyler değişiyor ... ve sunucuya eşitlenmesi gereken her model nesne üzerinde 1 sync_status ayarlamak için ekleyin. Yeni model nesneleri bir GUID oluşturmak gerekir.

Eşitleme tek bir istek. İstek içerir:

  • MAX modeli nesneleri zaman damgası last_modified. Bu sadece bu zaman damgası sonra değişiklik istiyor sunucu söyler.
  • Sync_status=1 ile tüm öğeleri içeren bir JSON dizi.

Sunucu isteği alır ve bu

  • JSON dizinin içeriğini alır ve onu içeren kayıtları değiştirir ekler. Last_modified alan otomatik olarak güncellenir.
  • Sunucu JSON dizi last_modified zaman damgası ile tüm nesneleri zaman damgası isteği gönderilmiş daha fazla döndürür. Bu kaydı başarıyla sunucuya eşzamanlı bildirim olarak hizmet veren sadece alınan nesneler yer alacak.

App yanıt alır ve bu

  • JSON dizinin içeriğini alır ve onu içeren kayıtları değiştirir ekler. Her kayıt 0 sync_status.

Umarım yardımcı olmuştur. Word, kayıt ve model birbirinin yerine kullandım, ama siz anladınız sanırım. İyi şanslar.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Sam Kear

    Sam Kear

    14 Temmuz 2007
  • TomSka

    TomSka

    30 Mayıs 2006
  • vgeller1

    vgeller1

    22 Kasım 2009