この質問は、このスレッドに関連している:私のtableViewControllerでhow-to-set-the-height-of-a-cell-depending-on-a-uilabel-with-a-typewriter-effectOperationQueueを正しく使用するには?
、私の細胞はsetTextWithTypeAnimationで管理タイプライターの効果でUILabelが含まれています。
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)
}
}
}
まず、私は(how-to-set-the-height-of-a-cell-depending-on-a-uilabel-with-a-typewriter-effectを参照)は、細胞内のアニメーションを管理するためにDispatchQueueを使用しますが、ユーザーがビューを閉じたときに、私はスレッドを停止するために必要なコントローラ。私は(DispatchQueueが停止することはできません)
問題がcompletionBlockが呼び出されたときに、アプリがクラッシュした私は、レイアウトの制約を更新しようとすると、あるOperationQueueを使用している理由です。
This application is modifying the autolayout engine from a background thread after the engine was accessed from the main thread.
このクラッシュを回避するにはどうすればよいですか?
'mainQueue'よりも、別のqueeにUIのものをしないでください。 (セル、ラベル、アニメーション、クラス名はすべてUIで始まります)。 – shallowThought
@shallowThoughtはい私はそれについて読んでいますが、私のケースではメインスレッド上で自分のUIをどうやってやることができますか? – cmii