首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >watchOS 2.0 -不能取消WCSessionFileTransfer

watchOS 2.0 -不能取消WCSessionFileTransfer
EN

Stack Overflow用户
提问于 2015-09-29 02:18:24
回答 2查看 458关注 0票数 2

我们的应用程序允许用户在iPhone上选择他们希望在手表应用程序中显示的记录。

它的工作方式如下:

  1. 用户在他们的iPhone记录上点击“添加观看”
  2. 生成一个新版本的手表数据库,并将其发送给该手表。
  3. 手表应用程序接收和保存文件并更新其接口。

将一个新的数据库文件发送到手表,并对每个更改进行处理。如果手表是醒着的,因为它会给用户提供实时更新,这很好,但是如果手表在用户进行7次更改时睡着了,这意味着手表一醒来就正在接受和处理7个新文件。

我们只关心手表数据库的最新版本,所以我试图取消所有旧的未完成的文件传输.

代码:

在iPhone上,每次从监视数据库中添加/删除记录时,我们都尝试(不成功)取消挂起的文件传输,然后对最新的数据库文件进行排队:

代码语言:javascript
运行
复制
// 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

接受表上的文件:

代码语言:javascript
运行
复制
- (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的建议,在用户向手表添加/删除记录时触发的方法中,我尝试了以下方法:

代码语言:javascript
运行
复制
// store a reference to the file transfer and immediately cancel it
WCSessionFileTransfer *transfer = [session transferFile:self.urlToDatabase metadata:nil];
[transfer cancel];

这仍然会导致文件被发送到手表,而不是像人们所期望的那样取消它。

我还尝试了以下几点:

  1. 杀死手表应用程序(按住侧按钮直到“电源关闭”出现,然后再按住它)
  2. 从iPhone中添加/删除记录
  3. 重新启动监视应用程序

即使在这种情况下,手表也会接收所有“取消”的文件传输。

EN

回答 2

Stack Overflow用户

发布于 2015-09-29 06:27:28

cancel方法的文档说:

使用此方法可在文件传输完成之前取消它。如果文件已被传输,则调用此方法无效。

因此,似乎取消是“最大的努力”,并可能无法最终取消他们在所有情况下,特别是如果文件已经转移。

你是否认为它永远不会起作用,即使你立即打电话给cancel (试着在没有运行手表应用程序的情况下进行测试,因为这似乎加快了传输速度)?

票数 0
EN

Stack Overflow用户

发布于 2017-11-03 15:35:06

证明了这是因为文件url与我正在检查的传输的url不匹配。

我最近发现,在我自己的数组中保持WCSessionFileTransfer并取消它们比使用WCSession defaultSession.outstandingFileTransfers更可靠。

代码语言:javascript
运行
复制
NSMutableArray<WCSessionFileTransfer*>* inProgressTransfers = [NSMutableArray array];

因此,每次调用TransfeFile: metaData:

代码语言:javascript
运行
复制
WCSessionFileTransfer* transfer = [[WCSession defaultSession] transferFile:url metadata:metadata];
if (transfer)
{ 
    [self.inProgressTransfers addObject:transfer];
}

然后在适当的时候

代码语言:javascript
运行
复制
for (WCSessionFileTransfer* ourTransfer in  self.inProgressTransfers)
{
    [ourTransfer cancel];
    [self.inProgressTransfers removeObject:ourTransfer];
}

由于某种原因,保持对传输的控制使呼叫取消工作更加可靠。希望这对某人有帮助

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32834643

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档