Swiftgram/Display/ListViewTransactionQueue.swift
Peter Iakovlev 2d79df7e75 no message
2018-02-08 14:21:11 +04:00

63 lines
1.9 KiB
Swift

import Foundation
#if os(iOS)
import SwiftSignalKit
#else
import SwiftSignalKitMac
#endif
public typealias ListViewTransaction = (@escaping () -> Void) -> Void
public final class ListViewTransactionQueue {
private var transactions: [ListViewTransaction] = []
public final var transactionCompleted: () -> Void = { }
public init() {
}
public func addTransaction(_ transaction: @escaping ListViewTransaction) {
let beginTransaction = self.transactions.count == 0
self.transactions.append(transaction)
if beginTransaction {
transaction({ [weak self] in
if Thread.isMainThread {
if let strongSelf = self {
strongSelf.endTransaction()
}
} else {
Queue.mainQueue().async {
if let strongSelf = self {
strongSelf.endTransaction()
}
}
}
})
}
}
private func endTransaction() {
Queue.mainQueue().async {
self.transactionCompleted()
if !self.transactions.isEmpty {
let _ = self.transactions.removeFirst()
}
if let nextTransaction = self.transactions.first {
nextTransaction({ [weak self] in
if Thread.isMainThread {
if let strongSelf = self {
strongSelf.endTransaction()
}
} else {
Queue.mainQueue().async {
if let strongSelf = self {
strongSelf.endTransaction()
}
}
}
})
}
}
}
}