मेरे पास एक पूर्ण आकार का सेल है जो वीडियो चलाता है इसलिए एक समय में स्क्रीन पर केवल 1 सेल होता है। जब मैं ऊपर और नीचे स्क्रॉल करता हूं तो वीडियो रुक जाते हैं और वैसे ही चलते हैं जैसे उन्हें करना चाहिए, मुझे कोई समस्या नहीं है।

समस्या तब होती है जब reloadData को कॉल किया जाता है।

जब उपयोगकर्ता डेटा स्रोत के अंदर दूसरे से अंतिम आइटम तक पहुंचता है तो मैं पेजिनेट करता हूं। यदि उपयोगकर्ता उस दूसरे से अंतिम आइटम पर है और एक वीडियो चला रहा है, जब पेजिनेशन डेटा खींचता है और reloadData को कॉल किया जाता है, तो सेल के अंदर का वर्तमान वीडियो बाधित हो जाता है क्योंकि सेलफॉरइटम प्रत्येक नए आइटम के लिए डेटा स्रोत जोड़ा जाता है। .

मैंने डेटा मॉडल में एक बूल प्रॉपर्टी जोड़ने की कोशिश की और यह देखने के लिए जांच की कि क्या यह सच है, यदि ऐसा है तो वापस आएं लेकिन यह काम नहीं किया

एक बार reloadData कहे जाने पर मैं कोड को वर्तमान में दिखाई देने वाले सेल के अंदर से निष्पादित होने से कैसे रोक सकता हूं?

class Video {
    var url: URL?
    var videoId: String?
    var postDate: Double?
    var isUserWatchingVideo = false
}

var dataSource = [Video]()

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {

     cell.currentItem = indexPath.item
     cell.video = dataSource[indexPath.item]
}

func collectionView(_ collectionView: UICollectionView, didEndDisplaying cell: UICollectionViewCell, forItemAt indexPath: IndexPath) {

    // stop video from playing inside cell
    // reset the isUserWatchingVideo property to false
}

func scrollViewDidEndDragging(_ scrollView: UIScrollView, willDecelerate decelerate: Bool) {
    
    // when the user gets to the 2nd to last item inside the dataSource start to paginate
    handlePagination()
}

func handlePagination() {

    // new items are found and called for each new item added
    dataSource.append(video)
    dataSource.sort(by: { $0.postDate ?? 0 > $1.postDate ?? 0 })
    collectionView.reloadData // problem occurs once this runs because cellForItem && didEndDisplayingCell runs for each new item that was added
}

सेल के अंदर:

MyCell {

    var currentItem: Int?

    var video: Video? {
        didSet {
            guard let video = video else { return }

            if video.isUserWatchingVideo { return }

            if !video.isUserWatchingVideo {
                video.isUserWatchingVideo = true
            } 
            // get url > asset > playerItem > player
            cell.player.play()
        }
    }
}
0
Lance Samaria 19 जुलाई 2020, 09:34

1 उत्तर

सबसे बढ़िया उत्तर

पेजिनेशन के माध्यम से नए आइटम लोड करते समय आपको अपना दृष्टिकोण बदलना होगा। नया डेटा लोड होने पर संपूर्ण UICollectionView को पुनः लोड करने के बजाय, आपको नए सेल जोड़ने के लिए सम्मिलित आइटम का उपयोग करना होगा।

func handlePagination() {
    dataSource.append(video)
    collectionView.insertItems(at: <#T##[IndexPath]#>)
}
2
Frankenstein 19 जुलाई 2020, 06:37