2016-12-29 9 views
0

今日のウィジェットを使用しているアプリがあります。グループを使用してデータを共有しています。現在ウィジェットにデータが正しく表示されています。アプリのデータを変更してウィジェットを表示すると、正しく更新されます。今、ウィジェットの一部のデータを更新し、アプリに反映させたいと思います。今日の拡張機能で変更後のアプリケーションのCoreDataをリフレッシュ

アプリにはUITableViewがあるので、NSFetchedResultsControllerを使用してテーブルのデータを取得しています。このウィジェットは、fetchedResultsControllerの項目間をスクロールし、データを表示します。ウィジェット上で任意の数のアイテムを更新することが可能です。

これは他のアプリでも行われているため、これを行うことができます。私はちょうど私がウィジェット上のデータを更新したときにそれをリフレッシュできるようにする方法をアプリに知らせる方法を試すことができません。

私が試したことについては、何を試してみるか考えることができなかったためあまりありませんでした。

func controllerDidChangeContent(controller: NSFetchedResultsController) { 
    print ("Controller changed") 
} 

このイベントは、アプリケーションのデータを変更すると起動しますが、ウィジェットからデータを変更すると起動しません。以下の提案パー

、私はアプリ上のviewDidLoadに次のコードを追加:通知をキャッチし、その後

let center = NSNotificationCenter.defaultCenter() 

    center.addObserver(self, selector: #selector(self.contextUpdated(_:)),name: NSManagedObjectContextDidSaveNotification, 
    object: context) 

をそして:

@IBAction func contextUpdated(notification: NSNotification) { 
    print("Notification recieved") 
} 

私がやったと私は同じ結果が得られましたcontrollerDidChangeContentイベント - アプリケーションのデータを変更するときに発生しましたが、ウィジェットから何も得られませんでした。私の理解は、ウィジェットとアプリケーションが同じコンテナにないことです。そのため、私は通知を受け取っていません。

私が気づいたもう一つのことは、ウィジェットにデータを保存すると、アプリケーションのmocでデータを保存することができなくなることです。おそらく、ウィジェットのコンテキストがデータを更新し、アプリケーションのコンテキストを無効にしたためでしょうか?

+0

「NSFetchedResultsController」は、mocを保存すると自動的に更新されるはずです。 – oyalhi

答えて

0

NSFetchedResultsControllerは、mocを保存すると自動的に更新されるはずです。ただし、特定のエンティティやプロパティなどのためにmocが保存されると、変更をサブスクライブすることもできます。変更をサブスクライブしたら、変更内容を除外してオブジェクトを抽出し、それに応じてテーブルを更新することができます。

let center = NotificationCenter.default 

center.addObserver(self, 
        selector: #selector(CLASS_NAME_HERE.contextUpdated(_:)), 
        name: NSNotification.Name.NSManagedObjectContextDidSave, 
        object: context) 

// we would like to get notified for all changes to the given entity 
// if you need more specific data, update the predicate as needed 
let entityPredicate = NSPredicate(format: "entity.name == %@", ENTITIY_NAME_HERE) 

func contextUpdated(_ notification: Notification) { 
    // all changes (inserted, updated, deleted) to the moc matching the predicate are inside notification 
    print("\(notification) 
} 

次のように通知をフィルタリングできます。以下は挿入されたものですが、更新されたオブジェクトや削除されたオブジェクトを取得するために簡単に変更できます。

let info = (notification as NSNotification).userInfo 
if let set = info?[NSInsertedObjectsKey] as? NSSet, let insert = set.allObjects as? [NSManagedObject] { 
    let inserted = insert.filter { return predicate.evaluate(with: $0) } 
} 
+0

私はデータがウィジェットに保存された後に利用可能であると確信していますが、ウィジェットからアイテムがいつ更新されるかを知る方法がわかりません。私はウィジェットから戻ってくるときに彼らが発砲するかどうかを見るために様々なイベントを試みましたが、どれも働いていませんでした。 私は通知に入る必要があると思います。何らかの理由で、彼らは私に無限に混乱しています。 –

関連する問題