- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
此问题与此线程有关:how-to-set-the-height-of-a-cell-depending-on-a-uilabel-with-a-typewriter-effect
在我的 tableViewController 中,我的单元格包含 UILabel,它具有使用 setTextWithTypeAnimation 管理的打字机效果;
func configureCell(tableView: UITableView, cell: ParagraphTableViewCell, atIndexPath indexPath: IndexPath) {
let paragraph = paragraphArray[indexPath.row] as! Paragraph
cell.paragraph = paragraph
self.queue = OperationQueue()
let operation1 = BlockOperation(block: {
cell.dialogueLabel.setTextWithTypeAnimation(typedText: paragraph.dialogueLabel.text!, queue:self.queue, callBackAfterCharacterInsertion: {
self.tableView.beginUpdates()
self.tableView.endUpdates()
})
})
operation1.completionBlock = {
cell.buttonsStackViewHeightConstraint.constant = CGFloat(HEIGHT_CONSTRAINT)
UIView.animate(withDuration: 0.3, animations: {
cell.contentView.layoutIfNeeded()
}, completion: nil)
}
queue.addOperation(operation1)
}
我的打字机在 UILabel 扩展中:
extension UILabel {
func setTextWithTypeAnimation(typedText: String, queue: OperationQueue, characterInterval: TimeInterval = 0.05, callBackAfterCharacterInsertion:(()->())?) {
text = ""
for (_, character) in typedText.characters.enumerated() {
if queue.isSuspended {
OperationQueue.main.isSuspended = true
OperationQueue.main.cancelAllOperations()
break;
}
OperationQueue.main.addOperation {
self.text = self.text! + String(character)
callBackAfterCharacterInsertion?()
}
Thread.sleep(forTimeInterval: characterInterval)
}
}
}
首先,我使用 DispatchQueue 来管理单元格内的动画(参见 how-to-set-the-height-of-a-cell-depending-on-a-uilabel-with-a-typewriter-effect ),但我需要在用户关闭 View Controller 时停止线程。这就是我使用 OperationQueue 的原因(DispatchQueue 无法停止)
@IBAction func closeViewController(sender: AnyObject) {
dismiss(animated: true, completion: nil)
if self.queue != nil {
self.queue.isSuspended = true
self.queue.cancelAllOperations()
self.queue = nil
}
}
问题是调用 completionBlock 时,应用程序在我尝试更新布局约束时崩溃。
This application is modifying the autolayout engine from a background thread after the engine was accessed from the main thread.
如何避免这种崩溃?
最佳答案
您必须调用mainQueue
上的UI
内容。
例子:
operation1.completionBlock = {
DispatchQueue.main.async {
cell.buttonsStackViewHeightConstraint.constant = CGFloat(HEIGHT_CONSTRAINT)
UIView.animate(withDuration: 0.3, animations: {
cell.contentView.layoutIfNeeded()
}, completion: nil)
}
}
关于ios - 如何正确使用OperationQueue?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44922577/
我使用的是 swift 3.0.2。 Xcode 8.3.1 我尝试使用 isSuspended = true 属性,但它不会停止操作。 当我取消一个 operation1 时,所有其他依赖于 ope
在使用异步递归调用 API 时,我无法理解如何使用 GCD。 下面是三个类似方法之一,包含相同的逻辑,只是针对不同的数据和 API 端点。如果没有下一页请求,该方法应该完成并且下一个方法应该开始。 我
我感兴趣的是,当应用收到UIApplicationWillResignActive通知时,是否需要在OperationQueue中调用.cancelAllOperations()? 最佳答案 应用进入
从 iOS13 开始,可以使用 progress 属性监控 OperationQueue 的进度。文档指出,在跟踪进度时,只有不覆盖 start() 的操作才算数。但是,根据文档,异步操作必须覆盖st
我有一个操作队列,我正在调用 cancelAllOpeations 但如果我问OperationQueue.operationcount 它不会让我返回零。 我正在覆盖取消方法,一切正常,但 oper
我正在阅读有关 OperationQueue 的文档。 我有这样的疑问,我们正在创建的操作,BlockOperation 和 OperationQueue 的同步和异步状态是什么。 据我了解,它将作为
我创建了一个继承自基类“Operation”的子类“MyOperation”。我在“MyOperation”中添加了一个函数,该函数在类实例化时被调用。但是,当创建操作类并将其添加到操作队列时,不会调
如果我创建了一个管理器并实例化了,我会这样做: AFHTTPRequestOperation *operation = [self.manager HTTPRequestOperationWithRe
我正在做一些冗长的计算以在后台线程上创建图表数据 我本来是用GCD的,但是每次用户通过点击按钮过滤图表数据时,图表数据都需要重新计算,如果用户点击图表数据过滤按钮非常快(高级用户)然后图表循环在每个
DispatchGroup 和 OperationQueue 有方法 wait() 和 waitUntilAllOperationsAreFinished() 等待各自的所有操作排队等待完成。 但即使
我是一名 Android 开发者,目前正在学习 Swift。你能帮我处理 OperationQueue 吗? class ViewController: UIViewController {
我通过 JSON 获得了两种类型的信息,并且我正在使用 addObserver(forKeyPath:"operations"...) 向 2 个不同的操作队列类添加“操作”。在函数 observeV
当您需要在网络任务或操作的完成 block 中的主线程上执行某些操作时,以下哪种方法最合适,为什么?: OperationQueue.main.addOperation DispatchQueue.m
tl;dr 我有一个 OperationQueue,我想同时运行两个操作。这些操作异步下载一些东西,因此它们都会立即被触发,而不是一个接一个地运行。 我通过对每张图片执行以下操作来填充一张非常大的图片
我有一个串行 OperationQueue,其操作调用 usleep。我这样做是因为操作执行 block 与需要重复直到指定时间的计时器同步。 例如,将 3 个操作添加到 maxconcurrent
我陷入了一个概念上简单的问题。发生的事情是解析操作在下载操作的完成处理程序完成之前执行。因此,没有要解析的数据。您可以将以下代码直接放入文件中并运行它。 如何确保在解析操作运行之前完成下载? impo
设备:iPhone 8、Apple Watch Series 3 我目前正在开发一个手机应用 + watch 扩展,它使用标准 API 和相关的 OperationQueues 从所有 CoreMot
iOS 13 在 OperationQueue 类中引入了 progress 属性。同时,Apple 将 operations 和 operationCount 属性标记为已弃用,这表明它们不应再用于
有时我必须在主线程上执行某些操作,建议将代码放置在 OperationQueue.main.addOperation 中。 其他时候,建议将代码编写在DispatchQueue.main.async内
我在处理许多图像的管道中有 2 个步骤: 第 1 步:在本地加载(或下载)图像(IO 绑定(bind)) 第 2 步:运行机器学习模型(CPU/GPU/受计算限制/单线程,因为模型很大)。如何限制存储
我是一名优秀的程序员,十分优秀!