串行队列同步方法中断 Main 上的 UIView 动画
Serial Queue sync method interrupting UIView animation on Main
我遇到了一个问题,我的主进度条动画 运行 被我的串行队列的同步调用中断了。
以前我没有将此队列用作串行队列,而仅用作异步队列——但这会导致在处理进入 background/foreground 转换时出现问题,我不得不将队列视为同步队列并调用仅同步而不是异步。
现在,队列在流程方面保持我的应用程序完美运行——除了 UIView 动画现在断断续续(有时超过一秒)取决于对我的串行队列的每个同步调用的负载。
有没有办法允许对我的串行队列进行同步调用,而不会在我的 UIView 动画中造成这些卡顿?我试过动态调用每个同步块中的新动画到我的串行队列,但这并不能解决问题。
请尝试以下操作:
- 创建 NSOperationQueue。设置最大并发任务1。它将执行串行队列模式
- 创建 NSOperation Subclass(假设 CustomOperation)并在 main 方法中编写您想要的代码。一旦所需的工作完成触发完成并切换到主线程并进行进度条更新或其他
- 创建 CustomOperation 对象并将它们全部添加到步骤 1 队列
class自定义操作:操作{
var identifier:String?
var index:Int?
override func main() {
/// do sync or async tasks
//// post completion tasks
NotificationCenter.default.post(name: NSNotification.Name("TASKDONE"), object: self)
}
}
func addOperations() {
NotificationCenter.default.addObserver(self, selector: #selector(ViewController.trackOperation(operation:)), name: NSNotification.Name(rawValue: "TASKDONE"), object: nil)
let operationQueue = OperationQueue()
var items = [CustomOperation]()
for index in 0..<10 {
let operation = CustomOperation()
operation.index = index
operation.name = "Operation:\(index)"
items.append(operation)
}
operationQueue.maxConcurrentOperationCount = 1
operationQueue.addOperations(items, waitUntilFinished: false)
}
我遇到了一个问题,我的主进度条动画 运行 被我的串行队列的同步调用中断了。
以前我没有将此队列用作串行队列,而仅用作异步队列——但这会导致在处理进入 background/foreground 转换时出现问题,我不得不将队列视为同步队列并调用仅同步而不是异步。
现在,队列在流程方面保持我的应用程序完美运行——除了 UIView 动画现在断断续续(有时超过一秒)取决于对我的串行队列的每个同步调用的负载。
有没有办法允许对我的串行队列进行同步调用,而不会在我的 UIView 动画中造成这些卡顿?我试过动态调用每个同步块中的新动画到我的串行队列,但这并不能解决问题。
请尝试以下操作:
- 创建 NSOperationQueue。设置最大并发任务1。它将执行串行队列模式
- 创建 NSOperation Subclass(假设 CustomOperation)并在 main 方法中编写您想要的代码。一旦所需的工作完成触发完成并切换到主线程并进行进度条更新或其他
- 创建 CustomOperation 对象并将它们全部添加到步骤 1 队列
class自定义操作:操作{
var identifier:String?
var index:Int?
override func main() {
/// do sync or async tasks
//// post completion tasks
NotificationCenter.default.post(name: NSNotification.Name("TASKDONE"), object: self)
}
}
func addOperations() {
NotificationCenter.default.addObserver(self, selector: #selector(ViewController.trackOperation(operation:)), name: NSNotification.Name(rawValue: "TASKDONE"), object: nil)
let operationQueue = OperationQueue()
var items = [CustomOperation]()
for index in 0..<10 {
let operation = CustomOperation()
operation.index = index
operation.name = "Operation:\(index)"
items.append(operation)
}
operationQueue.maxConcurrentOperationCount = 1
operationQueue.addOperations(items, waitUntilFinished: false)
}