2016-07-26 36 views
9

ile NSUserDefaults değişiklikleri algıla! Bu ben bu kodu ile benim veri alma WKInterfaceController bui elma saate veri aktarmak için uygulama grubu kullanabilirsiniz Projemde suiteName

let sharedDefaults = NSUserDefaults(suiteName: "group.com.myappname.defaults") 
sharedDefaults?.setObject(MyData, forKey: "DataKey") 
sharedDefaults?.synchronize() 

gibi görünüm:

let sharedDefaults = NSUserDefaults(suiteName: "group.com.myappname.defaults") 
let MyData = sharedDefaults?.objectForKey("DataKey") as! [[AnyObject]] 

Tüm çalışmalar ince!

Şimdi ben sharedDefaults veri? .objectForKey ("DataKey") değiştirildi vermedi olmadığını saptamaya çalışır. (: "Group.com.myappname.defaults" suiteName) i NSUserDefaults Veriler değiştiğinde

override func willActivate() { 
NSUserDefaults(suiteName: "group.com.myappname.defaults")!.addObserver(self, forKeyPath: "DataKey", options: NSKeyValueObservingOptions.New, context: nil) 
} 

override func observeValueForKeyPath(keyPath: String?, ofObject object: AnyObject?, change: [String : AnyObject]?, context: UnsafeMutablePointer<Void>){ 
     print("Data Changed") 
} 

Ama "geçersiz kılma fonk observeValueForKeyPath" WKInterfaceController etkinleştirin zaman sadece arama ve arama vermedi: Ben yöntemini addObserver kullanmayı deneyin

Ayrıca ben NSNotificationCenter kullanmayı deneyin:?

override func willActivate() { 
let sharedDefaults = NSUserDefaults(suiteName: "group.com.myappname.defaults") 
NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(userDefaultsDidChangeNotificationMethod(_:)), name: NSUserDefaultsDidChangeNotification, object: nil) 
} 

func userDefaultsDidChangeNotificationMethod(notification: NSNotification){ 
print("Data Changed") 
} 

O ben yanlış yapıyor ne (

çalışmıyor i algılamak nasıl f veri değişti mi? Herkes başka bir yol biliyorsanız

var NeedCheking = Bool() 


override func willActivate() { 
     super.willActivate() 
     NeedChecking = true 
     CheckDefaults() 
} 

override func didDeactivate() { 
    NeedChecking = false 
    super.didDeactivate() 
} 

func CheckDefaults(){ 

     let priority = DISPATCH_QUEUE_PRIORITY_DEFAULT 
     dispatch_async(dispatch_get_global_queue(priority, 0)) { 

     repeat { 

      let sharedDefaults = NSUserDefaults(suiteName: "group.com.myappname.defaults") 
      let NewData = sharedDefaults?.objectForKey("DataKey") as! [[AnyObject]] 
      if NewData != self.MyData { 

       dispatch_async(dispatch_get_main_queue()) { 
        self.MyData = NewData 
        //Here do update actions! 
       } 
      } 
      sleep(2) 
     }while self.NeedChecking 
    } 
    } 

, cevap olarak çözümünüzü gönderin:

+1

Neden sadece NSUserDefaultsDidChangeNotification –

+0

Leo Dabus değil, NSNotificationCenter.defaultCenter(). AddObserver (self, selector: #selector (self.Refresh (_ :)), name: "MyData", object: nil) ?? ? – Dmitry

+0

'NSNotificationCenter.defaultCenter() addObserver (kendini, selector: #selector (kullanıcıDefaultsDidChangeNotificationMethod (_ :)), name: NSUserDefaultsDidChangeNotification, object: nil)' –

cevap

2

Bunun kötü bir yol olduğunu biliyorum, ama herhangi diğerlerini bulamadık ... Benim yöntemim sonsuz döngüdür bu soruya!

+0

Sonunda yaptım. Bunu yapmanın daha iyi bir yolunu bulamadım ... –

2

Relationship between the Watch app interface, the WatchKit extension, and the iOS app

Taban ilişki, sana ios uygulamasından en son verileri almak istiyorsanız KVO, watchos ve ios arasında çalışmıyor düşünüyorum iki yolu vardır. willActivate

  • Arkaplan Görevler
  • Arkaplan görevleri içinde

    1. Kontrol son veriler yukarı güncel uygulamanızın arayüzleri tutmak için bir yoldur. Sistemden bir arka plan görev nesnesinin alınması, belirli işlem türlerini gerçekleştirmek için sinyalinizdir. Görev nesnesi, gerçekleştirilecek görev türünü tanımlar ve görevi tamamlamak için gereken verileri içerir. uygulamanızın uzantısı temsilci yöntemini: Sistem handleBackgroundTasks arayarak uygulamanıza arka plan görevi nesneleri sunar.

      • Arka Planda Uygulama Yenileme İşlemleri:

        watchos arkaplan görevlerinin aşağıdaki türlerini destekler. uygulamanızın durumuna genel güncellemeleri işlemek için bir WKApplicationRefreshBackgroundTask nesnesini kullanın. Örneğin, şirketinizin sunucu ile check-in ya yeni içerik indirmeye başlamak için görev bu tür kullanabilir. Bu tür arka plan görevini uygulamanızın WKExtension nesnenizden açıkça planlayabilirsiniz.

      • Arkaplan Anlık Yenile Görevleri. Uygulamanızın arayüzünü anlık görüntüsünü almayı hazırlamada güncellemek için bir WKSnapshotRefreshBackgroundTask nesnesi kullanın. Sistem, bu görev tamamlandığında anlık görüntüyü otomatik olarak alır.Sistem, anlık görüntüsünü güncellemek için arka plan anlık görüntü yenileme görevlerini düzenli olarak planlar. Arayüzünüz değiştiğinde, bu türden bir görevi uygulamanızın WKExtension nesnesinden açıkça programlayabilirsiniz.
      • Arka Bağlan Bağlantı Görevleri. Watch Connectivity çerçevesini kullanarak iOS uygulamanız tarafından gönderilen verileri almak için bir WKWatchConnectivityRefreshBackgroundTask nesnesi kullanın. İzleme uygulamanız eşlenen iPhone'da çalışan ilgili iOS uygulamasından veri aldığında sistem bu tür bir görevi otomatik olarak oluşturur. Bu tür görevleri kendiniz planlamıyorsunuz.
      • Arka plan NSURLSession Görevleri. Bir NSURLSession nesnesi kullanarak daha önce talep ettiğiniz verileri almak için bir WKURLSessionRefreshBackgroundTask nesnesi kullanın. Bu görev, bir arkaplan aktarımı için yetkilendirme gerektirdiğinde veya bir arkaplan aktarımı tamamlandığında (başarılı veya başarısız) tetiklenir. Bu tür görevleri kendiniz planlamıyorsunuz.

    unutmayın arkaplan transferleri hemen teslim edilmeyebilir. Dosyalar ve içeriğe dayalı veriler mümkün olduğunca çabuk teslim edilir, ancak transferler anlık değildir. Büyük dosyaları veya büyük miktarlardaki verileri içeren veri dosyaları da tamamlanması için oldukça uzun bir zaman alır.