Saturday, 22 August 2020

TableView with labels, images, gifs and video hangs/stuck incorrect while fetch from firestore in iOS, Swift

I have tableview with label, imageView (for image, gif & video thumbnail). I am sure that doing wrong and I can't handle its completion handler due to which the app is hanged and stucked for long time.

My model is like,

struct PostiisCollection {
    var id :String?
    var userID: String?
    var leadDetails : NSDictionary?
    var company: NSDictionary?
    var content: String?
    
    init(Doc: DocumentSnapshot) {
        self.id = Doc.documentID
        self.userID = Doc.get("userID") as? String ?? ""
        self.leadDetails = Doc.get("postiiDetails") as? NSDictionary
        self.company = Doc.get("company") as? NSDictionary
        self.content = Doc.get("content") as? String ?? ""
        
    }
}

I wrote in my view controller for fetch this,

var postiisCollectionDetails = [PostiisCollection]()
 override func viewDidLoad() {
        super.viewDidLoad()
       let docRef = Firestore.firestore().collection("PostiisCollection").whereField("accessType", isEqualTo: "all_access")
               docRef.getDocuments { (querysnapshot, error) in
                if let doc = querysnapshot?.documents, !doc.isEmpty {
                    print("Document is present.")
                    for document in querysnapshot!.documents {
                        _ = document.documentID
                        if let compCode = document.get("company") as? NSDictionary {
                        do {
                        let jsonData = try JSONSerialization.data(withJSONObject: compCode)
                        let companyPost: Company = try! JSONDecoder().decode(Company.self, from: jsonData)
                        if companyPost.companyCode == AuthService.instance.companyId ?? ""{
                            print(AuthService.instance.companyId ?? "")
                            if (document.get("postiiDetails") as? NSDictionary) != nil {
                                let commentItem = PostiisCollection(Doc: document)
                                self.postiisCollectionDetails.append(commentItem)
                              
                            }
                            }} catch {
                              
                            }
                            DispatchQueue.main.async {
                                 
                                self.tableView.isHidden = false
                                self.tableView.reloadData()
                            }
                        }
                  
                    }}}
    
        
    }

I need to check for the index path with image view is either image or gif or video with different parameters, I tried with tableview delegate and datasource method by,

extension AllAccessPostiiVC: UITableViewDataSource, UITableViewDelegate {
    
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
   
        return postiisCollectionDetails.count
    }
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "AllAccessCell", for: indexPath)
    let label1 = cell.viewWithTag(1) as? UILabel
    let imagePointer = cell.viewWithTag(3) as? UIImageView   
     let getGif = arrPostiisCollectionFilter[indexPath.row].leadDetails?.value(forKey: "gif") as? NSArray
           let getPhoto = arrPostiisCollectionFilter[indexPath.row].leadDetails?.value(forKey: "photo") as? NSArray
           let getVideo = arrPostiisCollectionFilter[indexPath.row].leadDetails?.value(forKey: "video") as? NSArray
        
           label1?.text = "\(arrPostiisCollectionFilter[indexPath.row].leadDetails?.value(forKey: "title") ?? ""
            if getGif != nil {
               let arrGif = getGif?.value(forKey: "gifUrl") as! [String]
               print(arrGif[0])
               
               let gifURL : String = "\(arrGif[0])"
               let imageURL = UIImage.gifImageWithURL(gifURL)
              imagePointer?.image = imageURL
               playButton?.isHidden = true
           }
           if getPhoto != nil  {
               let arrPhoto = getPhoto?.value(forKey: "photoUrl")  as! [String]
                print(arrPhoto[0])
               let storageRef = Storage.storage().reference(forURL: arrPhoto[0])
               storageRef.downloadURL(completion: { (url, error) in
                   do {
                       let data = try Data(contentsOf: url!)
                       let image = UIImage(data: data as Data)
                       DispatchQueue.main.async {
                           imagePointer?.image = image
                           playButton?.isHidden = true
                       }
                   } catch {
                       print(error)
                   }
               })
           }
           if getVideo != nil {
                 let arrVideo = getVideo?.value(forKey: "videoUrl")  as! [String]
             
               let videoURL = URL(string: arrVideo[0])
               let asset = AVAsset(url:videoURL!)
                     if let videoThumbnail = asset.videoThumbnail{
                        SVProgressHUD.dismiss()
                       imagePointer?.image = videoThumbnail
                       playButton?.isHidden = false
                     }
             }  

}

If I run, the app hangs in this page and data load time is getting more, some cases the preview image is wrongly displayed and not able to handle its completion



from TableView with labels, images, gifs and video hangs/stuck incorrect while fetch from firestore in iOS, Swift

No comments:

Post a Comment