no message

This commit is contained in:
Peter Iakovlev 2018-03-28 16:04:20 +04:00
parent 60b55e5818
commit c7217f3ce7
5 changed files with 151 additions and 36 deletions

View File

@ -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 */,

View File

@ -12,7 +12,7 @@
<key>PostboxMac.xcscheme</key>
<dict>
<key>orderHint</key>
<integer>4</integer>
<integer>5</integer>
</dict>
<key>PostboxTests.xcscheme</key>
<dict>

View 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
}
}

View File

@ -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)

View File

@ -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)
}
}