mirror of
https://github.com/Swiftgram/Telegram-iOS.git
synced 2025-08-19 04:00:54 +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 */; };
|
D0BC386C1E3FCEE50044D6FE /* MultiplePeersView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0BC386B1E3FCEE50044D6FE /* MultiplePeersView.swift */; };
|
||||||
D0BC38721E409E670044D6FE /* RenderedPeer.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0BC38711E409E670044D6FE /* RenderedPeer.swift */; };
|
D0BC38721E409E670044D6FE /* RenderedPeer.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0BC38711E409E670044D6FE /* RenderedPeer.swift */; };
|
||||||
D0BC38731E409E670044D6FE /* 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 */; };
|
D0BE38391E7C1FD4000079AF /* ItemCollectionInfoView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0BE38381E7C1FD4000079AF /* ItemCollectionInfoView.swift */; };
|
||||||
D0BE383A1E7C1FD4000079AF /* 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 */; };
|
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>"; };
|
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>"; };
|
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>"; };
|
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>"; };
|
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>"; };
|
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>"; };
|
D0BEAF661E54B33900BD963D /* AccountRecord.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AccountRecord.swift; sourceTree = "<group>"; };
|
||||||
@ -840,6 +843,7 @@
|
|||||||
D0C26D801FE41323004ABF18 /* ChatListGroupReferenceUnreadCounters.swift */,
|
D0C26D801FE41323004ABF18 /* ChatListGroupReferenceUnreadCounters.swift */,
|
||||||
D04614322004F2CC00EC0EF2 /* LocalMessageTagsView.swift */,
|
D04614322004F2CC00EC0EF2 /* LocalMessageTagsView.swift */,
|
||||||
D0FC19542020CB7700FEDBB2 /* PeerGroupStateView.swift */,
|
D0FC19542020CB7700FEDBB2 /* PeerGroupStateView.swift */,
|
||||||
|
D0BE3033206026C800FBE6D8 /* MessagesView.swift */,
|
||||||
);
|
);
|
||||||
name = Views;
|
name = Views;
|
||||||
sourceTree = "<group>";
|
sourceTree = "<group>";
|
||||||
@ -1215,6 +1219,7 @@
|
|||||||
D073CE7B1DCBF3B4007511FD /* PeerNameIndexRepresentation.swift in Sources */,
|
D073CE7B1DCBF3B4007511FD /* PeerNameIndexRepresentation.swift in Sources */,
|
||||||
D073CE7D1DCBF3B4007511FD /* PeerPresence.swift in Sources */,
|
D073CE7D1DCBF3B4007511FD /* PeerPresence.swift in Sources */,
|
||||||
D0C26D821FE41323004ABF18 /* ChatListGroupReferenceUnreadCounters.swift in Sources */,
|
D0C26D821FE41323004ABF18 /* ChatListGroupReferenceUnreadCounters.swift in Sources */,
|
||||||
|
D0BE3035206026C800FBE6D8 /* MessagesView.swift in Sources */,
|
||||||
D0B4184C1D7DFE20004562A4 /* ContactPeerIdsView.swift in Sources */,
|
D0B4184C1D7DFE20004562A4 /* ContactPeerIdsView.swift in Sources */,
|
||||||
D0DA44491E4C7D1E005FDCA7 /* PostboxAccess.swift in Sources */,
|
D0DA44491E4C7D1E005FDCA7 /* PostboxAccess.swift in Sources */,
|
||||||
D0B167211F9EAAA900976B40 /* OrderedList.swift in Sources */,
|
D0B167211F9EAAA900976B40 /* OrderedList.swift in Sources */,
|
||||||
@ -1384,6 +1389,7 @@
|
|||||||
D0DA44481E4C7D1E005FDCA7 /* PostboxAccess.swift in Sources */,
|
D0DA44481E4C7D1E005FDCA7 /* PostboxAccess.swift in Sources */,
|
||||||
D0B167201F9EAAA900976B40 /* OrderedList.swift in Sources */,
|
D0B167201F9EAAA900976B40 /* OrderedList.swift in Sources */,
|
||||||
D0FC19552020CB7700FEDBB2 /* PeerGroupStateView.swift in Sources */,
|
D0FC19552020CB7700FEDBB2 /* PeerGroupStateView.swift in Sources */,
|
||||||
|
D0BE3034206026C800FBE6D8 /* MessagesView.swift in Sources */,
|
||||||
D0C26D721FE2E7A8004ABF18 /* GroupFeedReadStateTable.swift in Sources */,
|
D0C26D721FE2E7A8004ABF18 /* GroupFeedReadStateTable.swift in Sources */,
|
||||||
D0943AF11FD99DCD001522CC /* GroupChatListInclusion.swift in Sources */,
|
D0943AF11FD99DCD001522CC /* GroupChatListInclusion.swift in Sources */,
|
||||||
D0E3A7841B28AE0900A402D9 /* Peer.swift in Sources */,
|
D0E3A7841B28AE0900A402D9 /* Peer.swift in Sources */,
|
||||||
|
@ -12,7 +12,7 @@
|
|||||||
<key>PostboxMac.xcscheme</key>
|
<key>PostboxMac.xcscheme</key>
|
||||||
<dict>
|
<dict>
|
||||||
<key>orderHint</key>
|
<key>orderHint</key>
|
||||||
<integer>4</integer>
|
<integer>5</integer>
|
||||||
</dict>
|
</dict>
|
||||||
<key>PostboxTests.xcscheme</key>
|
<key>PostboxTests.xcscheme</key>
|
||||||
<dict>
|
<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
|
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] {
|
public func addMessages(_ messages: [StoreMessage], location: AddMessagesLocation) -> [Int64: MessageId] {
|
||||||
assert(!self.disposed)
|
assert(!self.disposed)
|
||||||
if let postbox = self.postbox {
|
if let postbox = self.postbox {
|
||||||
@ -2117,17 +2127,35 @@ public final class Postbox {
|
|||||||
return result
|
return result
|
||||||
}
|
}
|
||||||
|
|
||||||
#if DEBUG
|
private let canBeginTransactionsValue = Atomic<Bool>(value: true)
|
||||||
private let debugIsInTransactionValue = Atomic<Bool>(value: false)
|
public func setCanBeginTransactions(_ value: Bool) {
|
||||||
public var debugIsInTransaction: Bool {
|
self.queue.async {
|
||||||
return self.debugIsInTransactionValue.with { $0 }
|
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?) {
|
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.valueBox.begin()
|
||||||
self.afterBegin()
|
self.afterBegin()
|
||||||
let modifier = Modifier(postbox: self)
|
let modifier = Modifier(postbox: self)
|
||||||
@ -2135,9 +2163,6 @@ public final class Postbox {
|
|||||||
modifier.disposed = true
|
modifier.disposed = true
|
||||||
let (updatedTransactionState, updatedMasterClientId) = self.beforeCommit()
|
let (updatedTransactionState, updatedMasterClientId) = self.beforeCommit()
|
||||||
self.valueBox.commit()
|
self.valueBox.commit()
|
||||||
#if DEBUG
|
|
||||||
let _ = self.debugIsInTransactionValue.swap(false)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if let currentUpdatedState = self.currentUpdatedState {
|
if let currentUpdatedState = self.currentUpdatedState {
|
||||||
self.statePipe.putNext(currentUpdatedState)
|
self.statePipe.putNext(currentUpdatedState)
|
||||||
@ -2152,16 +2177,18 @@ public final class Postbox {
|
|||||||
let disposable = MetaDisposable()
|
let disposable = MetaDisposable()
|
||||||
|
|
||||||
let f: () -> Void = {
|
let f: () -> Void = {
|
||||||
let (_, updatedTransactionState, updatedMasterClientId) = self.internalTransaction({ modifier in
|
self.beginInternalTransaction {
|
||||||
disposable.set(f(subscriber, modifier))
|
let (_, updatedTransactionState, updatedMasterClientId) = self.internalTransaction({ modifier in
|
||||||
})
|
disposable.set(f(subscriber, modifier))
|
||||||
|
})
|
||||||
if updatedTransactionState != nil || updatedMasterClientId != nil {
|
|
||||||
//self.pipeNotifier.notify()
|
if updatedTransactionState != nil || updatedMasterClientId != nil {
|
||||||
}
|
//self.pipeNotifier.notify()
|
||||||
|
}
|
||||||
if let updatedMasterClientId = updatedMasterClientId {
|
|
||||||
self.masterClientId.set(.single(updatedMasterClientId))
|
if let updatedMasterClientId = updatedMasterClientId {
|
||||||
|
self.masterClientId.set(.single(updatedMasterClientId))
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if userInteractive {
|
if userInteractive {
|
||||||
@ -2174,23 +2201,25 @@ 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
|
return Signal { subscriber in
|
||||||
let f: () -> Void = {
|
let f: () -> Void = {
|
||||||
let (result, updatedTransactionState, updatedMasterClientId) = self.internalTransaction({ modifier in
|
self.beginInternalTransaction(ignoreDisabled: ignoreDisabled, {
|
||||||
return f(modifier)
|
let (result, updatedTransactionState, updatedMasterClientId) = self.internalTransaction({ modifier in
|
||||||
|
return f(modifier)
|
||||||
|
})
|
||||||
|
|
||||||
|
if updatedTransactionState != nil || updatedMasterClientId != nil {
|
||||||
|
//self.pipeNotifier.notify()
|
||||||
|
}
|
||||||
|
|
||||||
|
if let updatedMasterClientId = updatedMasterClientId {
|
||||||
|
self.masterClientId.set(.single(updatedMasterClientId))
|
||||||
|
}
|
||||||
|
|
||||||
|
subscriber.putNext(result)
|
||||||
|
subscriber.putCompletion()
|
||||||
})
|
})
|
||||||
|
|
||||||
if updatedTransactionState != nil || updatedMasterClientId != nil {
|
|
||||||
//self.pipeNotifier.notify()
|
|
||||||
}
|
|
||||||
|
|
||||||
if let updatedMasterClientId = updatedMasterClientId {
|
|
||||||
self.masterClientId.set(.single(updatedMasterClientId))
|
|
||||||
}
|
|
||||||
|
|
||||||
subscriber.putNext(result)
|
|
||||||
subscriber.putCompletion()
|
|
||||||
}
|
}
|
||||||
if userInteractive {
|
if userInteractive {
|
||||||
self.queue.justDispatchWithQoS(qos: DispatchQoS.userInteractive, f)
|
self.queue.justDispatchWithQoS(qos: DispatchQoS.userInteractive, f)
|
||||||
|
@ -23,6 +23,7 @@ public enum PostboxViewKey: Hashable {
|
|||||||
case chatListTopPeers(groupId: PeerGroupId)
|
case chatListTopPeers(groupId: PeerGroupId)
|
||||||
case groupFeedReadStateSyncOperations
|
case groupFeedReadStateSyncOperations
|
||||||
case localMessageTag(LocalMessageTags)
|
case localMessageTag(LocalMessageTags)
|
||||||
|
case messages(Set<MessageId>)
|
||||||
|
|
||||||
public var hashValue: Int {
|
public var hashValue: Int {
|
||||||
switch self {
|
switch self {
|
||||||
@ -70,6 +71,8 @@ public enum PostboxViewKey: Hashable {
|
|||||||
return 9
|
return 9
|
||||||
case let .localMessageTag(tag):
|
case let .localMessageTag(tag):
|
||||||
return tag.hashValue
|
return tag.hashValue
|
||||||
|
case .messages:
|
||||||
|
return 10
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -207,6 +210,12 @@ public enum PostboxViewKey: Hashable {
|
|||||||
} else {
|
} else {
|
||||||
return false
|
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)
|
return MutableGroupFeedReadStateSyncOperationsView(postbox: postbox)
|
||||||
case let .localMessageTag(tag):
|
case let .localMessageTag(tag):
|
||||||
return MutableLocalMessageTagsView(postbox: postbox, tag: 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