我们的应用程序允许用户在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];这仍然会导致文件被发送到手表,而不是像人们所期望的那样取消它。
我还尝试了以下几点:
即使在这种情况下,手表也会接收所有“取消”的文件传输。
发布于 2015-09-29 06:27:28
cancel方法的文档说:
使用此方法可在文件传输完成之前取消它。如果文件已被传输,则调用此方法无效。
因此,似乎取消是“最大的努力”,并可能无法最终取消他们在所有情况下,特别是如果文件已经转移。
你是否认为它永远不会起作用,即使你立即打电话给cancel (试着在没有运行手表应用程序的情况下进行测试,因为这似乎加快了传输速度)?
发布于 2017-11-03 15:35:06
证明了这是因为文件url与我正在检查的传输的url不匹配。
我最近发现,在我自己的数组中保持WCSessionFileTransfer并取消它们比使用WCSession defaultSession.outstandingFileTransfers更可靠。
NSMutableArray<WCSessionFileTransfer*>* inProgressTransfers = [NSMutableArray array];因此,每次调用TransfeFile: metaData:
WCSessionFileTransfer* transfer = [[WCSession defaultSession] transferFile:url metadata:metadata];
if (transfer)
{
[self.inProgressTransfers addObject:transfer];
}然后在适当的时候
for (WCSessionFileTransfer* ourTransfer in self.inProgressTransfers)
{
[ourTransfer cancel];
[self.inProgressTransfers removeObject:ourTransfer];
}由于某种原因,保持对传输的控制使呼叫取消工作更加可靠。希望这对某人有帮助
https://stackoverflow.com/questions/32834643
复制相似问题