【问题标题】:Thumbnail image created from server video url keeps changing when scroll tableview从服务器视频 url 创建的缩略图图像在滚动 tableview 时不断变化
【发布时间】:2020-11-29 03:41:15
【问题描述】:

在我的应用程序中,我已经成功地从视频 url 创建了缩略图图像并显示在表格单元格中,但问题是当我滚动表格视图单元格时,缩略图图像不断变化。如何解决这个问题。请帮我解决这个问题,因为我尝试过搜索但没有运气

我的代码尝试过: 我的单元类代码:-

class VideoCell: UITableViewCell {

    static let cellID = "VideoCell"
      
    //MARK:- Outlets
    @IBOutlet weak var videoThumbImage: UIImageViewX!
    @IBOutlet weak var dateLbl: UILabel!
    @IBOutlet weak var mainView: UIViewX!
    @IBOutlet weak var userProfileImage: UIImageViewX!
    @IBOutlet weak var playBtn: UIButton!
    
    //MARK:- Properties
    var chatObj:ModelOldMessagesMessages? {
        didSet {
            configure()
        }
    }
    
    //MARK:- Life Cycle
    override func awakeFromNib() {
        super.awakeFromNib()
        
        self.mainView.layer.cornerRadius = 10
        self.mainView.layer.maskedCorners = [.layerMaxXMaxYCorner,.layerMaxXMinYCorner,.layerMinXMaxYCorner]
    }
    
    //MARK:- Helpers
    private func configure() {
        guard let obj = chatObj else {return}
        
        if let msgStr = obj.chatMsgText, let time = obj.chatMsgDatetime, time.count > 0, msgStr.count > 0 {
            let time = convertUTCToLocal(timeString: time)
            self.dateLbl.text = changeDateForamte(time!, conVertFormate: "hh:mm a", currentDateFormate: "yyyy-MM-dd HH:mm:ss ")
            
            let imgStr = WS_Chat_DownloadFile + msgStr
            let url = URL(string: imgStr)!
            
            self.getThumbnailImageFrom(fileUrl: url) { (image) in
               self.videoThumbImage.image = image
            }
        }
        if let tmpImgURL = obj.adminImage, tmpImgURL.count > 0 {
            let img = WS_DownloadImage + tmpImgURL
            self.userProfileImage.loadImage(img)
        }
        
    }
    
    fileprivate func getThumbnailImageFrom(fileUrl: URL, completion: @escaping (_ image: UIImage?) -> Void){
        DispatchQueue.global().async {
             let asset = AVAsset(url: fileUrl)
             let imgGenerator = AVAssetImageGenerator(asset: asset)
             imgGenerator.appliesPreferredTrackTransform = true
            
             let thumbnailTime = CMTimeMake(value: 2, timescale: 1)
            
            do {
                let thumbnailCGImage = try imgGenerator.copyCGImage(at: thumbnailTime, actualTime: nil)
                let finalImage = UIImage(cgImage: thumbnailCGImage)
                
                DispatchQueue.main.async {
                    completion(finalImage)
                }
                
            } catch let err {
                print(err.localizedDescription)
                DispatchQueue.main.async {
                    completion(nil)
                }
            }
        }
    }

我的 cellforrow 函数

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        
    
        let dict = oldMessageArr[indexPath.row]
         
let videoCell = tableView.dequeueReusableCell(withIdentifier: VideoCell.cellID) as! VideoCell
            videoCell.chatObj = dict
            videoCell.playBtn.tag = indexPath.row
            videoCell.playBtn.addTarget(self, action: #selector(handlePlayBtn), for: .touchUpInside)
        return videoCell
    }

根据计时器调用聊天 api 的主控制器类文件代码:

//MARK:- Life Cycle

override func viewDidLoad() {
    super.viewDidLoad()
    registerCell()
    setupRefreshControl()
}

override func viewWillAppear(_ animated: Bool) {
    WS_GetOldMessagesAPI()
    self.newMessagesLoadTimer.invalidate()
}

func setupRefreshControl() {
    refresher.tintColor = .black
    refresher.addTarget(self, action: #selector(refreshData), for: .valueChanged)
    self.tableView.addSubview(refresher)
}

@objc func refreshData() {
   self.WS_GetOldMessagesAPI()
}

@objc func timerAction() {
    self.newMessagesLoadTimer.invalidate()
    self.WS_getNewMessage()
}
 

func WS_getNewMessage()
    {
        var url = String()
        
        let model = ApiUtillity.sharedInstance.getLoginModel()
        
        if let c_id = model?.loginDataResult?.chatRoomsId {
            self.chatRoomId = c_id
        }
        
        var offset = Int()
        let dict = oldMessageArr.last
        if let offID = dict?.chatMsgId {
            offset = offID
        }
        
        url = WS_GET_OldChatMessage+"\(chatRoomId)"+"?"+"offsetID=\(offset)"
        
        APIClient<ModelBaseOldMessages>().API_GET(Url: url, Params: noParams, Authentication: true, Progress: false, Alert: true, Offline: false, SuperVC: self, completionSuccess: { (modelResponse) in
            
            if(modelResponse.success == true) {
                if offset == 0 {
                    self.getNewMessageArr.removeAll()
                    if let data = modelResponse.oldMessagesMessages, data.count != 0 {
                        for item in data {
                            if let id = item.chatMsgId, self.newMessageIDsArr.contains(id) == false {
                                self.newMessageIDsArr.append(id)
                                self.getNewMessageArr.append(item)
                                self.tableView.scrollToBottom()
                            }
                        }
                     
                        self.newMessagesLoadTimer = Timer.scheduledTimer(timeInterval: 5, target: self, selector: #selector(self.timerAction), userInfo: nil, repeats: true)
                        self.tableView.reloadData()
                    }
                } else {
                    if let data = modelResponse.oldMessagesMessages, data.count != 0 {
                        for item in data {
                            if let id = item.chatMsgId, self.newMessageIDsArr.contains(id) == false {
                                self.newMessageIDsArr.append(id)
                                self.getNewMessageArr.append(item)
                            }
                        }
                        
                        self.newMessagesLoadTimer = Timer.scheduledTimer(timeInterval: 5, target: self, selector: #selector(self.timerAction), userInfo: nil, repeats: true)
                        self.tableView.reloadData()
                    }
                }
            } else {
                self.newMessagesLoadTimer = Timer.scheduledTimer(timeInterval: 5, target: self, selector: #selector(self.timerAction), userInfo: nil, repeats: true)
                self.tableView.reloadData()
            }
        }) { (failed) in
            self.tableView.reloadData()
        }
    }

    func WS_GetOldMessagesAPI() {
        
        var url = String()
        var offset = Int()
        
        let model = ApiUtillity.sharedInstance.getLoginModel()
        
        if let c_id = model?.loginDataResult?.chatRoomsId {
            self.chatRoomId = c_id
        }
        
        let dict = oldMessageArr.first
        if let offID = dict?.chatMsgId {
            offset = offID
        }
        
        url = WS_GET_OldChatMessage+"\(chatRoomId)"+"?"+"offsetID=\(offset)"
        
        APIClient<ModelBaseOldMessages>().API_GET(Url: url, Params: noParams, Authentication: true, Progress: true, Alert: true, Offline: false, SuperVC: self, completionSuccess: { (modelResponse) in
            
            print("---------------------")
            print("Result:",modelResponse.toJSONString(prettyPrint: true)!)
            print("---------------------")
            
            if(modelResponse.success == true) {
                if let data = modelResponse.oldMessagesMessages, data.count != 0 {
                    let neweReverseData = data.reversed()
                    for item in neweReverseData
                    {
                        if let id = item.chatMsgId, self.oldMessageIDsArr.contains(id) == false
                        {
                            self.oldMessageIDsArr.insert(id, at: 0)
                            self.oldMessageArr.insert(item, at: 0)
                        }
                    }
                    self.refresher.endRefreshing()
                    self.reloadTable()
                    
                    self.tableView.scrollToRow(at: IndexPath.init(row: data.count - 1, section: 0), at: .top, animated: false)
                }
                self.WS_getNewMessage()
            } else {
                self.refresher.endRefreshing()
                self.reloadTable()
            }
        }) { (failed) in
            self.refresher.endRefreshing()
            self.reloadTable()
        }
    }

【问题讨论】:

  • 请帮我解决这个问题
  • 显示cellForRowAt 函数。您可能没有清理数据以供单元格重复使用。
  • 在行的单元格中,我只是分配像 videocell.chatobj = oldmessages[indexpath.row] 这样的数据
  • 现在我应该在哪里更改我上面的代码先生

标签: swift scroll lag


【解决方案1】:

在配置函数的开头,在获取和设置缩略图之前,添加

self.videoThumbImage.image = nil

【讨论】:

  • U 的意思是在 awakefromnib 函数中我应该做 imagwview.image = nil
  • 好的,我会试着让你知道先生
  • 实际上它可以工作,但它会像第一个空白一样继续闪烁,然后显示图像,然后再次显示空白,然后显示图像,因为它是一个聊天消息单元格,api 每 5 秒运行一次新消息..编辑我的代码
  • 请帮忙
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-04-18
  • 2015-03-30
  • 2017-12-10
  • 2011-04-17
  • 2017-06-27
  • 2011-06-14
  • 2011-11-22
相关资源
最近更新 更多