ios - 使用 CoreData 时如何与 Watch OS 2 共享数据以显示在 WKInterfaceTable 中
<p><p>我正在使用 <code>WatchConnectivity</code> 尝试将名为 <code>arrayOfOjects</code> 的 <code>NSManagedObject</code> 类型的数据发送到 Watch。每个 <code>object</code> 都有一个名为 <code>title</code> 的字符串属性。</p>
<p>Watch 上的 <code>InterfaceController</code> 加载并显示并清空表 - 因为数组为空,所以当用户请求数据时,它会使用 <code>didReceiveMessage</code> 发送电话上的方法。 </p>
<p>我不确定如何将字典数组添加到 objectsArray 以显示在 <code>WKInterfaceTable</code> 中。 </p>
<p>有谁知道我如何将数据发送到 watch 以显示在表格中以进行更改并将它们与手机同步? </p>
<p><strong>Apple Watch:</strong> </p>
<pre><code>class ObjectsInterfaceController: WKInterfaceController, WCSessionDelegate {
var session : WCSession!
var objectsArray = []()
@IBOutlet var table: WKInterfaceTable!
@IBOutlet var titleLabel: WKInterfaceLabel!
func loadTableData() {
table.setNumberOfRows(self.objectsArray.count, withRowType: "CellRow")
if self.objectsArray.count > 0 {
for (index, name) in self.objectsArray.enumerate() {
let row = self.table.rowControllerAtIndex(index) as! CellRowController
row.objectCellLabel.setText(name.title)
}
}
}
override init() {
super.init()
loadTableData()
}
override func awakeWithContext(context: AnyObject?) {
super.awakeWithContext(context)
// Interface Objects
}
override func willActivate() {
// This method is called when watch view controller is about to be visible to user
super.willActivate()
//Check if session is supported and Activate
if (WCSession.isSupported()) {
session = WCSession.defaultSession()
session.delegate = self
session.activateSession()
}
}
//Swift
func session(session: WCSession, didReceiveMessage message: , replyHandler: () -> Void) {
let value = message["Value"]
dispatch_async(dispatch_get_main_queue()) {
self.objectsArray.removeAll()
self.objectsArray.append(value! as! Array)
self.loadTableData()
}
//send a reply
replyHandler(["Value":"Yes"])
}
}
</code></pre>
<p><strong>iPhone</strong></p>
<p>我已经获取了所有对象并存储在数组中。 </p>
<pre><code>var objectsArray = ()
func session(session: WCSession, didReceiveMessage message: , replyHandler: () -> Void) {
//send a reply
replyHandler(["Value": ])
}
</code></pre>
<p>我需要能够修改对象的属性并将更改保存在 iPhone 上,但 atm 我什至无法发送数据并在表中显示:( 我已经能够在字典中发送简单的字符串值设备,但不是数组或实际数据。</p></p>
<br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
<p><p><strong>TL/DR:</strong></p>
<p>您只能将基本类型(如字符串、整数、 double )发送到 watch 。 <a href="https://stackoverflow.com/q/31920373/4151918" rel="noreferrer noopener nofollow">This question has more details about sending custom objects</a> .</p>
<p><strong>另一个问题:</strong></p>
<p>即使您归档或序列化了托管对象,<em>仍然无法</em>将特定数据从手机发送到 watch 。</p>
<p><code>NSManagedObject</code> 仅在其自己的上下文中有效<em></em>。在这种情况下,托管对象会在您的 iOS 应用程序上使用特定的 <code>NSMangedObjectContext</code> 进行注册。托管对象除了它的上下文没有用处,而且它的托管对象上下文不存在于手机以外的任何地方。</p>
<blockquote>
<p>NSManagedObject instances are not intended to be passed between queues. Doing so can result in corruption of the data and termination of the application. When it is necessary to hand off a managed object reference from one queue to another, it must be done through NSManagedObjectID instances.</p>
</blockquote>
<p>由于不可能将托管对象从一个上下文(或线程或队列)传递到 <em>same</em> 平台上的另一个上下文,因此您绝对不能在手机与其配对的 watch 之间传递托管对象.</p>
<p><strong>你能做什么?</strong></p>
<ul>
<li><p>如果您有办法在手机和 watch 之间共享您的 Core Data 存储,您可以将托管对象 ID 转换为字符串(使用 <code>URIRepresentation</code>),然后将这些字符串传递给 watch ,然后将这些字符串转换回对象 ID 并获取相应的对象。 <a href="https://stackoverflow.com/q/29563667/4151918" rel="noreferrer noopener nofollow">This is explained in detail in this question</a> .</p>
<p>但是,watchOS 2 不再支持应用组,而且要让两个不同的商店跨设备保持同步会非常复杂。</p></li>
<li><p>一个更轻松的解决方案是传递有关标题的详细信息,跟踪您在 watch 上所做的任何更改,然后发回一个包含插入、删除或以其他方式更改的标题的字典。</p>
<p>然后手机会更新与这些更改的标题相对应的托管对象。</p>
<p>这类似于 <code>NSFetchedResultsControllerDelegate</code> 响应更改以保持其结果同步的方式。</p></li>
</ul>
<blockquote>
<p>Does anyone know how I can send the data to the watch to display in the table to make changes and sync them back with the phone?</p>
</blockquote>
<p>我给了你一个总体概述。任何更详细的内容都过于广泛,无法在此答案中涵盖。我只能建议开发人员要么使用第三方框架,要么编写自己的实现。</p>
<p><strong>一些注意事项:</strong></p>
<p><em>请记住,您不希望通过来回传输大量数据来降低用户的观看体验。保持您的 watch 应用轻巧且响应迅速,因为它的理想设计是只使用几秒钟。</em></p>
<p><em>如果您可以简化 watch 应用程序设计(例如,仅将待办事项列表项标记为已完成),则可以消除大部分“同步”开销,并将更复杂的任务委托(delegate)给 iOS 应用程序。</em></p></p>
<p style="font-size: 20px;">关于ios - 使用 CoreData 时如何与 Watch OS 2 共享数据以显示在 WKInterfaceTable 中,我们在Stack Overflow上找到一个类似的问题:
<a href="https://stackoverflow.com/questions/35929366/" rel="noreferrer noopener nofollow" style="color: red;">
https://stackoverflow.com/questions/35929366/
</a>
</p>
页:
[1]