当前位置: 首页 > 知识库问答 >
问题:

Swift 3中可重用单元的出队速度非常慢

夏侯英纵
2023-03-14

将单元格出列需要0.5-1.0秒,这意味着我的UITableView需要2-3秒才能加载,即使它只有4行。

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    var cellid = "NumberCell"
    var isnumber = true
    if indexPath.row == 0 {
        cellid = "TextCell"
        isnumber = false
    }
    
    NSLog("before dequeue \(indexPath)")
    let cell = tableView.dequeueReusableCell(withIdentifier: cellid, for: indexPath) as! TextfieldTableViewCell
    NSLog("dequeued")
    
    // ...
    
    return cell
}

前面和后面的NSLog()语句显示出队列从07.47到08.38。

2017-07-25 22:07:07.471898-0700 myapp[10209:4507471]出列前[0,0]

2017-07-25 22:07:07.679715-0700myapp[10209:4507471][MC]systemgroup.com.apple.configurationprofiles路径的系统组容器 /private/var/containers/Shared/SystemGroup/systemgroup.com.apple.configurationprofiles

2017-07-25 22:07:07.683843-0700 myapp[10209:4507471][MC]读取公共有效用户设置。

2017-07-25 22:07:08.386960-0700 myapp[10209:4507471]已退出队列

细胞非常简单。它只有一个UILabel和一个UITextField,UITextField有一个编辑更改动作。就是这样。

到底是什么原因导致一个单元需要这么长时间才能出队?是关于系统组容器的另外两个系统NSLog()吗?

这使我的应用程序几乎无法使用,因为当我尝试切换到此视图控制器时,应用程序在设置4行时似乎锁定了2-4秒。

我在Objective-C中制作了数百个UITableViewController,但我从未遇到过这个问题。斯威夫特3有什么奇怪的地方我错过了吗?

共有3个答案

谢泽语
2023-03-14

我认为这段代码没有任何问题。我认为,除非您的代码中遗漏了一些重要的问题,否则退出队列的代码不会持续这么长时间。如果您的表视图像您所说的那样简单,那么不会花费太长时间。但要进行调试,必须考虑以下几点:

>


let start=CACurrentMediaTime()
let cell=tableView.dequeueReusableCell(带有标识符:cellie,用于:indexPath)as! Textfield dTableViewCell
let完成=CACurrentMediaTime()
print("出列时间:(完成-开始)")

如果出队时间是可接受的,则您的性能问题不是由它引起的。

如果出列时间仍然不可接受。一个有意义的原因是,您的tableview只有四行,并且没有一行比tableview高,因此tableview不会使用缓冲区中的单元格,而是要自下而上创建一个单元格。这个操作比使用缓冲区中的单元格要耗时得多。但这个过程是不可避免的,因为每个使用tableview的应用程序都会遇到它。因此,您应该考虑您的模拟器(假设您使用的是模拟器)是否太慢,无法运行您的应用程序。因为模拟器和真实iPhone的速度有很大的不同。

朱博实
2023-03-14

我终于解决了这个问题,这完全是我的错。我无意中要求每个领域的第一响应者。

为了方便起见,我已经重写了setSelected(\:animated:),这样,如果我触碰该行,该行的textfield将成为第一响应者(以防我试图点击某个字段而未点击)。问题是,我忘记在becomeFirstResponder()调用周围放置if语句。

错误代码:

override func setSelected(_ selected: Bool, animated: Bool) {
    super.setSelected(selected, animated: animated)

    self.textfield.becomeFirstResponder()
}

在对单元格进行排队后,它会将其默认设置为selected=false,这将导致它尝试成为第一响应者。我犯了个愚蠢的错误。

以下是我打算做的:

override func setSelected(_ selected: Bool, animated: Bool) {
    super.setSelected(selected, animated: animated)

    if selected {
        self.textfield.becomeFirstResponder()
    }
}
澹台岳
2023-03-14

2017-07-25 22:07:07.679715-0700myapp[10209:4507471][MC]systemgroup.com.apple.configurationprofiles路径的系统组容器 /private/var/containers/Shared/SystemGroup/systemgroup.com.apple.configurationprofiles

2017-07-25 22:07:07.683843-0700 myapp[10209:4507471][MC]读取公共有效用户设置。

⚠️ 这是操作系统级别的日志。您的UITableCell退出队列的延迟

您可以禁用不需要的登录xcode。如下所示

1-从Xcode菜单打开:<代码>产品

2-在您的环境变量上,在值集中设置OS\U ACTIVITY\U MODE

只有在调试应用程序时,您才会遇到此问题。这将在真实设备上运行良好。

 类似资料:
  • 问题内容: 我有一个MySQL查询(Ubu 10.04,Innodb,Core i7、16Gb RAM,SSD驱动器,优化的MySQL参数): 表em_link_data有大约700万行,em_link有数千行。此查询大约需要 18秒 才能完成。但是,如果我替换子查询的结果并执行以下操作: 那么查询将在不到1毫秒的时间内运行。仅子查询在不到1毫秒的时间内运行,因此索引了列linkid。 如果我将查

  • 问题内容: 我正在查询有关的信息。 我正在迭代一个数组,并查询列表中的每个值。 不幸的是 ,在调试器下, 单个查询大约需要3-4秒,而 在禁用调试器的情况下, 查询时间要 短一些。 任何想法为什么这么慢?我使用进行测试。 这是我的代码: 更新资料 当我离开时,评估很快就完成了,但是我没有得到。它返回一个空字符串… 问题答案: 感谢@nvrmnd我尝试了一下,发现了一种更好的解析器: VTD-XML

  • 问题内容: 我面临一个非常奇怪的问题:使用Redis时,我的写入速度非常糟糕(在理想情况下,写入速度应该接近RAM上的写入速度)。 这是我的基准: 是生成随机字符串的类(arg是字符串长度) 以下是几个结果: [写入] nb:100000 |时间:4.408319378 |速度:0.713905907055318 MB / s [写入] nb:100000 |时间:4.4139469070553

  • 我试图支持我们网站上的网络摄像头视频的录制,然后我需要转码到MP4和 ;WebM,以支持HTML5播放。我在我们的服务器上安装了FFMPEG1.2,整个过程运行得相当好。 不过,我遇到的一个问题是将FLV转换成MP4。它是不可接受的慢,例如,一个8秒的FLV需要大约2.5分钟的代码转换! 我使用的命令是: 有太多的参数,我有点不知道解决这个问题的最佳方法。您可以从这里下载测试flv: 相比之下,转

  • 我正在经营Prestashop供电商店。我有大约25000种产品。我有删除产品的问题。每当我在后台按下删除按钮,它就会一直加载。当我刷新页面时,产品会从后台的产品列表中删除。我对新老产品都有这个问题。有Prestashop经验的人能给我解释一下吗?

  • 问题内容: 我已经开发了一个用户批量上传模块。有两种情况,当数据库有零条记录时,我批量上传了20000条记录。大约需要5个小时。但是,当数据库已经有大约30 000条记录时,上传速度将非常缓慢。上载2万条记录大约需要11个小时。我只是通过fgetcsv方法读取CSV文件。 下面是运行的查询。(我正在使用Yii框架) 如果存在,请更新用户: 如果用户不存在,请插入新记录。 表引擎类型为MYISAM。