mirror of
https://github.com/Swiftgram/Telegram-iOS.git
synced 2025-08-19 12:10:55 +00:00
no message
This commit is contained in:
parent
60b55e5818
commit
c7217f3ce7
@ -212,6 +212,8 @@
|
||||
D0BC386C1E3FCEE50044D6FE /* MultiplePeersView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0BC386B1E3FCEE50044D6FE /* MultiplePeersView.swift */; };
|
||||
D0BC38721E409E670044D6FE /* RenderedPeer.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0BC38711E409E670044D6FE /* RenderedPeer.swift */; };
|
||||
D0BC38731E409E670044D6FE /* RenderedPeer.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0BC38711E409E670044D6FE /* RenderedPeer.swift */; };
|
||||
D0BE3034206026C800FBE6D8 /* MessagesView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0BE3033206026C800FBE6D8 /* MessagesView.swift */; };
|
||||
D0BE3035206026C800FBE6D8 /* MessagesView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0BE3033206026C800FBE6D8 /* MessagesView.swift */; };
|
||||
D0BE38391E7C1FD4000079AF /* ItemCollectionInfoView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0BE38381E7C1FD4000079AF /* ItemCollectionInfoView.swift */; };
|
||||
D0BE383A1E7C1FD4000079AF /* ItemCollectionInfoView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0BE38381E7C1FD4000079AF /* ItemCollectionInfoView.swift */; };
|
||||
D0BEAF631E54B2FA00BD963D /* AccountManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0BEAF621E54B2FA00BD963D /* AccountManager.swift */; };
|
||||
@ -480,6 +482,7 @@
|
||||
D0B844501DAC04FE005F29E1 /* PeerPresence.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PeerPresence.swift; sourceTree = "<group>"; };
|
||||
D0BC386B1E3FCEE50044D6FE /* MultiplePeersView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MultiplePeersView.swift; sourceTree = "<group>"; };
|
||||
D0BC38711E409E670044D6FE /* RenderedPeer.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RenderedPeer.swift; sourceTree = "<group>"; };
|
||||
D0BE3033206026C800FBE6D8 /* MessagesView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MessagesView.swift; sourceTree = "<group>"; };
|
||||
D0BE38381E7C1FD4000079AF /* ItemCollectionInfoView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ItemCollectionInfoView.swift; sourceTree = "<group>"; };
|
||||
D0BEAF621E54B2FA00BD963D /* AccountManager.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AccountManager.swift; sourceTree = "<group>"; };
|
||||
D0BEAF661E54B33900BD963D /* AccountRecord.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AccountRecord.swift; sourceTree = "<group>"; };
|
||||
@ -840,6 +843,7 @@
|
||||
D0C26D801FE41323004ABF18 /* ChatListGroupReferenceUnreadCounters.swift */,
|
||||
D04614322004F2CC00EC0EF2 /* LocalMessageTagsView.swift */,
|
||||
D0FC19542020CB7700FEDBB2 /* PeerGroupStateView.swift */,
|
||||
D0BE3033206026C800FBE6D8 /* MessagesView.swift */,
|
||||
);
|
||||
name = Views;
|
||||
sourceTree = "<group>";
|
||||
@ -1215,6 +1219,7 @@
|
||||
D073CE7B1DCBF3B4007511FD /* PeerNameIndexRepresentation.swift in Sources */,
|
||||
D073CE7D1DCBF3B4007511FD /* PeerPresence.swift in Sources */,
|
||||
D0C26D821FE41323004ABF18 /* ChatListGroupReferenceUnreadCounters.swift in Sources */,
|
||||
D0BE3035206026C800FBE6D8 /* MessagesView.swift in Sources */,
|
||||
D0B4184C1D7DFE20004562A4 /* ContactPeerIdsView.swift in Sources */,
|
||||
D0DA44491E4C7D1E005FDCA7 /* PostboxAccess.swift in Sources */,
|
||||
D0B167211F9EAAA900976B40 /* OrderedList.swift in Sources */,
|
||||
@ -1384,6 +1389,7 @@
|
||||
D0DA44481E4C7D1E005FDCA7 /* PostboxAccess.swift in Sources */,
|
||||
D0B167201F9EAAA900976B40 /* OrderedList.swift in Sources */,
|
||||
D0FC19552020CB7700FEDBB2 /* PeerGroupStateView.swift in Sources */,
|
||||
D0BE3034206026C800FBE6D8 /* MessagesView.swift in Sources */,
|
||||
D0C26D721FE2E7A8004ABF18 /* GroupFeedReadStateTable.swift in Sources */,
|
||||
D0943AF11FD99DCD001522CC /* GroupChatListInclusion.swift in Sources */,
|
||||
D0E3A7841B28AE0900A402D9 /* Peer.swift in Sources */,
|
||||
|
@ -12,7 +12,7 @@
|
||||
<key>PostboxMac.xcscheme</key>
|
||||
<dict>
|
||||
<key>orderHint</key>
|
||||
<integer>4</integer>
|
||||
<integer>5</integer>
|
||||
</dict>
|
||||
<key>PostboxTests.xcscheme</key>
|
||||
<dict>
|
||||
|
69
Postbox/MessagesView.swift
Normal file
69
Postbox/MessagesView.swift
Normal file
@ -0,0 +1,69 @@
|
||||
import Foundation
|
||||
|
||||
|
||||
import Foundation
|
||||
|
||||
final class MutableMessagesView: MutablePostboxView {
|
||||
fileprivate let ids: Set<MessageId>
|
||||
private let peerIds: Set<PeerId>
|
||||
fileprivate var messages: [MessageId: Message] = [:]
|
||||
|
||||
init(postbox: Postbox, ids: Set<MessageId>) {
|
||||
self.ids = ids
|
||||
self.peerIds = Set(ids.map { $0.peerId })
|
||||
for id in ids {
|
||||
if let message = postbox.getMessage(id) {
|
||||
self.messages[message.id] = message
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func replay(postbox: Postbox, transaction: PostboxTransaction) -> Bool {
|
||||
var updatedIds = Set<MessageId>()
|
||||
for peerId in self.peerIds {
|
||||
if let operations = transaction.currentOperationsByPeerId[peerId] {
|
||||
for operation in operations {
|
||||
switch operation {
|
||||
case let .InsertMessage(message):
|
||||
if self.ids.contains(message.id) {
|
||||
updatedIds.insert(message.id)
|
||||
}
|
||||
case let .Remove(indices):
|
||||
for index in indices {
|
||||
if self.ids.contains(index.0.id) {
|
||||
updatedIds.insert(index.0.id)
|
||||
}
|
||||
}
|
||||
default:
|
||||
break
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if !updatedIds.isEmpty {
|
||||
for id in updatedIds {
|
||||
if let message = postbox.getMessage(id) {
|
||||
self.messages[message.id] = message
|
||||
} else {
|
||||
self.messages.removeValue(forKey: id)
|
||||
}
|
||||
}
|
||||
|
||||
return true
|
||||
} else {
|
||||
return false
|
||||
}
|
||||
}
|
||||
|
||||
func immutableView() -> PostboxView {
|
||||
return MessagesView(self)
|
||||
}
|
||||
}
|
||||
|
||||
public final class MessagesView: PostboxView {
|
||||
public var messages: [MessageId: Message] = [:]
|
||||
|
||||
init(_ view: MutableMessagesView) {
|
||||
self.messages = view.messages
|
||||
}
|
||||
}
|
@ -28,6 +28,16 @@ public final class Modifier {
|
||||
self.postbox = postbox
|
||||
}
|
||||
|
||||
public func keychainEntryForKey(_ key: String) -> Data? {
|
||||
assert(!self.disposed)
|
||||
return self.postbox?.keychainTable.get(key)
|
||||
}
|
||||
|
||||
public func setKeychainEntry(_ value: Data, forKey key: String) {
|
||||
assert(!self.disposed)
|
||||
self.postbox?.keychainTable.set(key, value: value)
|
||||
}
|
||||
|
||||
public func addMessages(_ messages: [StoreMessage], location: AddMessagesLocation) -> [Int64: MessageId] {
|
||||
assert(!self.disposed)
|
||||
if let postbox = self.postbox {
|
||||
@ -2117,17 +2127,35 @@ public final class Postbox {
|
||||
return result
|
||||
}
|
||||
|
||||
#if DEBUG
|
||||
private let debugIsInTransactionValue = Atomic<Bool>(value: false)
|
||||
public var debugIsInTransaction: Bool {
|
||||
return self.debugIsInTransactionValue.with { $0 }
|
||||
private let canBeginTransactionsValue = Atomic<Bool>(value: true)
|
||||
public func setCanBeginTransactions(_ value: Bool) {
|
||||
self.queue.async {
|
||||
let previous = self.canBeginTransactionsValue.swap(value)
|
||||
if previous != value && value {
|
||||
let fs = self.queuedInternalTransactions.swap([])
|
||||
for f in fs {
|
||||
f()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private var queuedInternalTransactions = Atomic<[() -> Void]>(value: [])
|
||||
|
||||
private func beginInternalTransaction(ignoreDisabled: Bool = false, _ f: @escaping () -> Void) {
|
||||
assert(self.queue.isCurrent())
|
||||
if ignoreDisabled || self.canBeginTransactionsValue.with({ $0 }) {
|
||||
f()
|
||||
} else {
|
||||
let _ = self.queuedInternalTransactions.modify { fs in
|
||||
var fs = fs
|
||||
fs.append(f)
|
||||
return fs
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
private func internalTransaction<T>(_ f: (Modifier) -> T) -> (result: T, updatedTransactionStateVersion: Int64?, updatedMasterClientId: Int64?) {
|
||||
#if DEBUG
|
||||
let _ = self.debugIsInTransactionValue.swap(true)
|
||||
#endif
|
||||
self.valueBox.begin()
|
||||
self.afterBegin()
|
||||
let modifier = Modifier(postbox: self)
|
||||
@ -2135,9 +2163,6 @@ public final class Postbox {
|
||||
modifier.disposed = true
|
||||
let (updatedTransactionState, updatedMasterClientId) = self.beforeCommit()
|
||||
self.valueBox.commit()
|
||||
#if DEBUG
|
||||
let _ = self.debugIsInTransactionValue.swap(false)
|
||||
#endif
|
||||
|
||||
if let currentUpdatedState = self.currentUpdatedState {
|
||||
self.statePipe.putNext(currentUpdatedState)
|
||||
@ -2152,6 +2177,7 @@ public final class Postbox {
|
||||
let disposable = MetaDisposable()
|
||||
|
||||
let f: () -> Void = {
|
||||
self.beginInternalTransaction {
|
||||
let (_, updatedTransactionState, updatedMasterClientId) = self.internalTransaction({ modifier in
|
||||
disposable.set(f(subscriber, modifier))
|
||||
})
|
||||
@ -2164,6 +2190,7 @@ public final class Postbox {
|
||||
self.masterClientId.set(.single(updatedMasterClientId))
|
||||
}
|
||||
}
|
||||
}
|
||||
if userInteractive {
|
||||
self.queue.justDispatchWithQoS(qos: DispatchQoS.userInteractive, f)
|
||||
} else {
|
||||
@ -2174,9 +2201,10 @@ public final class Postbox {
|
||||
}
|
||||
}
|
||||
|
||||
public func modify<T>(userInteractive: Bool = false, _ f: @escaping(Modifier) -> T) -> Signal<T, NoError> {
|
||||
public func modify<T>(userInteractive: Bool = false, ignoreDisabled: Bool = false, _ f: @escaping(Modifier) -> T) -> Signal<T, NoError> {
|
||||
return Signal { subscriber in
|
||||
let f: () -> Void = {
|
||||
self.beginInternalTransaction(ignoreDisabled: ignoreDisabled, {
|
||||
let (result, updatedTransactionState, updatedMasterClientId) = self.internalTransaction({ modifier in
|
||||
return f(modifier)
|
||||
})
|
||||
@ -2191,6 +2219,7 @@ public final class Postbox {
|
||||
|
||||
subscriber.putNext(result)
|
||||
subscriber.putCompletion()
|
||||
})
|
||||
}
|
||||
if userInteractive {
|
||||
self.queue.justDispatchWithQoS(qos: DispatchQoS.userInteractive, f)
|
||||
|
@ -23,6 +23,7 @@ public enum PostboxViewKey: Hashable {
|
||||
case chatListTopPeers(groupId: PeerGroupId)
|
||||
case groupFeedReadStateSyncOperations
|
||||
case localMessageTag(LocalMessageTags)
|
||||
case messages(Set<MessageId>)
|
||||
|
||||
public var hashValue: Int {
|
||||
switch self {
|
||||
@ -70,6 +71,8 @@ public enum PostboxViewKey: Hashable {
|
||||
return 9
|
||||
case let .localMessageTag(tag):
|
||||
return tag.hashValue
|
||||
case .messages:
|
||||
return 10
|
||||
}
|
||||
}
|
||||
|
||||
@ -207,6 +210,12 @@ public enum PostboxViewKey: Hashable {
|
||||
} else {
|
||||
return false
|
||||
}
|
||||
case let .messages(ids):
|
||||
if case .messages(ids) = rhs {
|
||||
return true
|
||||
} else {
|
||||
return false
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -257,5 +266,7 @@ func postboxViewForKey(postbox: Postbox, key: PostboxViewKey) -> MutablePostboxV
|
||||
return MutableGroupFeedReadStateSyncOperationsView(postbox: postbox)
|
||||
case let .localMessageTag(tag):
|
||||
return MutableLocalMessageTagsView(postbox: postbox, tag: tag)
|
||||
case let .messages(ids):
|
||||
return MutableMessagesView(postbox: postbox, ids: ids)
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user