Kaynağa Gözat

feat: 调整礼物资源拉取逻辑

陈文艺 1 hafta önce
ebeveyn
işleme
9c9cfd05fd

+ 4 - 4
Lanu/Manager/Gift/LNGiftManager.swift

@@ -41,12 +41,12 @@ class LNGiftManager {
     
     func fetchGiftList(roomId: String, queue: DispatchQueue = .main, handler: @escaping ([LNGiftItemVO]?) -> Void) {
         LNHttpManager.shared.loadGiftList(roomId: roomId) { [weak self] res, err in
+            guard let self else { return }
+            let list = res?.list.filter { self.resourceMap[$0.resId] != nil }
             queue.asyncIfNotGlobal {
-                handler(res?.list)
+                handler(list)
             }
-            if let res, let self, res.list.contains(where: {
-                self.resourceMap[$0.resId] == nil
-            }) {
+            if let list, list.count != res?.list.count {
                 updateGiftResource()
             }
             if let err {

+ 2 - 3
Lanu/Views/Room/Gift/List/LNRoomGiftListView.swift

@@ -27,9 +27,7 @@ class LNRoomGiftListView: UIView {
     }
     
     private var roomSession: LNRoomViewModel?
-    private var giftList: [LNGiftItemVO] {
-        roomSession?.giftList ?? []
-    }
+    private var giftList: [LNGiftItemVO] = []
     
     weak var delegate: LNRoomGiftListViewDelegate?
     
@@ -46,6 +44,7 @@ class LNRoomGiftListView: UIView {
     
     func update(_ room: LNRoomViewModel?) {
         roomSession = room
+        giftList = roomSession?.giftList ?? [] // 拷贝一份,避免房间数据更新后导致界面异常 
         selectedIndex = nil
         collectionView.reloadData()
     }

+ 12 - 11
Lanu/Views/Room/ViewModel/LNRoomViewModel.swift

@@ -103,6 +103,7 @@ class LNRoomViewModel: NSObject {
     }
     private let systemHandlerQueue = DispatchQueue(label: "com.gami.room.system.message", attributes: .concurrent)
     
+    private var isLoadingGiftList = false
     private(set) var giftList: [LNGiftItemVO] = []
     
     init(roomId: String) {
@@ -119,7 +120,7 @@ class LNRoomViewModel: NSObject {
         setupMessageObservers()
         setupRoomInfoObserver()
         setupAudienceEventObservers()
-        fetchGiftList()
+        reloadGiftList()
         
         LNRoomManager.shared.updateCurRoom(self)
     }
@@ -474,11 +475,9 @@ extension LNRoomViewModel {
                 newMessage.forEach {
                     switch $0.messageType {
                     case .text:
-                        if let item = LNRoomUserMessage(info: $0) {
-                            if let messageItems = item.messageItems,
-                               !messageItems.isEmpty {
-                                chatMessage.append(contentsOf: messageItems)
-                            }
+                        if let messageItems = LNRoomUserMessage(info: $0)?.messageItems,
+                           !messageItems.isEmpty {
+                            chatMessage.append(contentsOf: messageItems)
                         }
                     case .custom:
                         if let item = LNRoomPushMessage(info: $0) {
@@ -597,13 +596,15 @@ extension LNRoomViewModel {
         }
     }
     
-    private func fetchGiftList() {
+    func reloadGiftList() {
+        guard !isLoadingGiftList else { return }
+        isLoadingGiftList = true
         LNGiftManager.shared.fetchGiftList(roomId: roomId) { [weak self] list in
             guard let self else { return }
-            guard let list, !list.isEmpty else { return }
-            giftList = list.filter({
-                LNGiftManager.shared.resource(for: $0.resId) != nil
-            })
+            if let list, !list.isEmpty  {
+                giftList = list
+            }
+            isLoadingGiftList = false
         }
     }
 }