【发布时间】:2015-12-26 09:11:27
【问题描述】:
我们的应用程序允许用户在 iPhone 上选择他们希望在手表应用程序中显示的记录。
它是这样工作的:
- 用户在 iPhone 上点击记录上的“添加到观看”
- 新版本的手表数据库生成并发送给手表
- 手表应用接收并保存文件并更新其界面
一个新的数据库文件被发送到手表并针对每次更改进行处理。如果手表是醒着的,这很好,因为它会给用户实时更新,但如果手表在用户进行 7 次更改时处于睡眠状态,这意味着手表一醒来就接受并处理 7 个新文件。
我们真的只关心手表数据库的最新版本,所以我正在尝试取消所有旧的未完成文件传输。
代码:
在 iPhone 上,每次从手表数据库中添加/删除记录时,我们都会尝试(不成功)取消挂起的文件传输,然后将最新的数据库文件排队:
// create watch database and store it at self.urlToDatabase
[self generateNewWatchDatabase];
if ([WCSession isSupported])
{
WCSession *session = [WCSession defaultSession];
session.delegate = self;
[session activateSession];
// this is the problem - cancel doesn't seem to do anything
for (WCSessionFileTransfer *fileTransfer in session.outstandingFileTransfers)
[fileTransfer cancel];
[session transferFile:self.urlToDatabase metadata:nil];
}
在上面的代码中,调用[fileTransfer cancel]成功地从session.outstandingFileTransfers中移除了WCSessionFileTransfer对象,但是下面仍然多次调用didReceiveFile。
在手表上接受文件:
- (void)session:(WCSession *)session didReceiveFile:(WCSessionFile *)file
{
// this method gets called once for every time -transferFile:metadata: is called above,
// even after cancelling outstanding file transfers
[self replaceDatabaseWithFile:file];
[self refreshItemsTable];
}
我们如何取消未完成的文件传输?
编辑
根据@ccjensen 的建议,我在用户向手表添加/删除记录时触发的方法中尝试了以下操作:
// store a reference to the file transfer and immediately cancel it
WCSessionFileTransfer *transfer = [session transferFile:self.urlToDatabase metadata:nil];
[transfer cancel];
这仍然会导致文件被发送到手表,而不是像预期的那样取消它。
我还尝试了以下方法:
- 杀死手表应用(按住侧边按钮直到出现“关机”,然后再次按住)
- 从 iPhone 添加/删除记录
- 重新启动手表应用
即使在这种情况下,手表也会收到所有“取消”的文件传输。
【问题讨论】:
标签: ios iphone watchkit apple-watch watchos-2