2011-03-30 18 views
9

Kullanıcının, iphone'un ayarlar alanındaki ayarlarında değişiklik yapmasına izin veriyorum. Bir sonraki ağ senkronizasyonu sırasında kullanıcı değişikliklerini sunucuya göndermek istiyorum. Ama sadece değişiklikler yapılırsa.Kullanıcıların ayar paketindeki değişikliklere ne zaman dönüştüğünü öğrenmek için

Ancak, kullanıcının ayarlar alanında ne zaman değişiklik yaptığını nasıl bilebilirim?

Yapabiliyorsam, değiştirilmiş olsun ya da olmasın, her zaman bilgileri sunucudan almayıp, varsayılan olarak kullanıcı varsayılanlarından farklıysa, her zaman bilgileri göndermekten kaçınmak isterim.

Bu sorunu çözmenin güzel ve zarif bir yolu var mı? Yardımlarınız için teşekkür ederiz!

Bir hafta sonra cevap yok ... Bu soru çok mu zor, yoksa hiç bir anlamı yok mu?

cevap

16

Ah aptal ben! İşte zarif bir şekilde gidiyoruz. XCode içindeki Apple Dokümantasyonunda AppPrefs'i arayın ve tam olarak ne yapmak istediğinizi yapan bir örnek uygulama gösterecektir. Sadece derleyin ve çalıştırın! NSUserDefaultsDidChangeNotification'dan yararlanır.

Bu

kod bir gözlemci kayıt için kullanılıyor:

[[NSNotificationCenter defaultCenter] addObserver:self 
             selector:@selector(defaultsChanged:) 
              name:NSUserDefaultsDidChangeNotification 
              object:nil]; 

Eski cevap:

Size dışında bir değişiklik tarihini alabilir sanki gibi görünmüyor NSUserDefaults. Şimdiye kadar sadece bu şekilde düşünebilirsiniz: Varsayılan değerleri:

NSUserDefaults *previousDefaults = [someInstance previousUserDefaults]; 
NSUserDefaults *currentDefaults = [NSUserDefaults standardUserDefaults]; 

if([previousDefaults isEqualToDictionary:currentDefaults]) 
{ 
    [someOtherInstance sendModifiedUserDefaultsToServerWithDefaults:currentDefaults]; 
    [yetAnotherInstance saveModified] 
} 

Sen uygulaması ilk defa başlatıldığında diske sözlük olarak kullanıcı varsayılan Kendini kurtarmak zorundayız. Daha sonra, uygulama her açıldığında bu iki sözlükleri karşılaştırırsınız. Onlar

+0

Hm.Daha iyi bir yol olduğunu düşündüğüm şey, iphone'daki ağ ayarlarınızı değiştirdiğinizde otomatik olarak bulmayı ve ona bağlanmayı denemesidir. Bu, kullanıcı ayar değişikliğinin bir eylemi tetiklediği anlamına gelmelidir. Bu benim için de güzel bir çözüm olurdu. Bunu nasıl yapıyorlar? – san

+0

İşte, sorun için zarif ve basit bir çözüm. –

+0

Oh evet! Bu harika. Ancak bu, ayarlarda herhangi bir değişikliği tetikler. Sadece belirli bir özellik değişikliğine göre hareket etmenin bir yolu var mı? – san

2

Bu soru çok zor değil, sadece sorduğun şeyi yapmanın basit bir yolu yok. NSUserDefaults, her uygulamanın ayarları için "en az değiştirilmiş" bir tarih kaydetmiyor, en azından söyleyebildiğim kadarıyla, kullanıcı Ayarlar uygulamasını kullanarak bazı ayarları değiştirirse, göz atmaktan başka bir şey algılamanın iyi bir yolu yoktur. tüm ayarlar.

Bunu gerçekten yapmanız gerekiyorsa, en iyi seçeneğin, bazı veri yapısını senkronize etmek istediğiniz ilgili ayarları okumak ve bu yapıya göre bir çeşit karma veya sağlama toplamı hesaplamak olduğunu düşünüyorum. Bu değeri, uygulamanın son çalıştırıldığı zaman hesapladığınız değerle karşılaştırın ve farklıysa sunucuyla senkronize edin. İstediğinizde bu değeri NSUserDefaults'da saklayabilirsiniz, ancak hesaba dahil etmediğinizden emin olun.

+0

Teşekkürler Caleb.Kurumumu çok karmaşık yapmak istemiyorum.Buna benzer bir şeye ihtiyaç duyulmadığı ve kütüphanede fikirleri destekleyecek hiçbir şeyin olmadığı bir şeye şaşırdım, örneğin, bir değişikliğe tepki gösterme kullanıcı ayarlarında. – san

+0

Genellikle, bir uygulama tercihlerinin son zamanlarda değişip değişmediğini umursamamaktadır - her ne zaman onlara ihtiyaç duyduğunda bunları varsayılan sistemden okur, böylece bir şey değiştiyse, uygulama otomatik olarak yeni değeri alır. Ayrıca, NSUserDefaults, MacOS X'ten gelir ve bu bağlamda kullanıcının, uygulamanın tercih dosyasını, herhangi bir yan etki olmadan silebilmesi gerekir; Uygulama sadece yerleşik varsayılanlarına geri dönmelidir. IOS'ta bile, kritik bilgileri varsayılan sistemde saklayamazdım. – Caleb

İlgili konular