मैं एक ऐसे ऐप पर काम कर रहा हूं जो बहुत सारी छवियों को लोड करता है। मेरे पास एक टेबल व्यू सेल है जिसमें से प्रत्येक की एक छवि है।
छवियाँ S3 बाल्टी में संग्रहीत हैं। प्रत्येक छवि बहुत बड़ी है, लगभग 720 KB, और हर बार जब मैं स्क्रॉल करता हूं तो पूरी छवि प्राप्त करने के लिए स्क्रीन थोड़ी फ़्रीज हो जाती है।

यहाँ मेरा कोड है जो छवि प्राप्त करता है

let url: String = "\(K.baseURLForImage)\(cellImageURL)"
let validURL = URL(string: url)
if let imageData = try? Data(contentsOf: validURL!) {
    let image = UIImage(data: imageData)
    cell.cellImage.image = image
}

निश्चित रूप से यह अच्छा नहीं है, तो क्या इससे निपटने का कोई तरीका है?
मैंने सुना है कि dequeueReusableCell का उपयोग नहीं करना अच्छा नहीं है

पहले ही, आपका बहुत धन्यवाद।

संपादित करें
मैंने इन पंक्तियों को जोड़ा

    if let validURL = URL(string: url) {
        task = URLSession.shared.dataTaskPublisher(for: validURL)
            .sink(receiveCompletion: { completion in
                // error handling
                print("failed URL: '\(url)'")
            }, receiveValue: { (data, response) in
                image = UIImage(data: data)
            })
        return image
    } else {
        return nil
    }

लेकिन जब भी मैं इस फ़ंक्शन को कॉल करता हूं, तो मुझे nil मिलता है।
मैंने जाँच की कि छवि का URL मान्य है।

0
bichanna 30 अगस्त 2021, 19:33

2 जवाब

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

मैंने किंगफिशर के साथ अपनी समस्या का समाधान किया!

यहाँ मेरा कोड है

import Kingfisher

let url: String = "some url"
let validURL = URL(string: url)
KF.url(validURL!)
    .set(to: cell.cellImage)

return cell
0
Agent Noby 31 अगस्त 2021, 03:25

जैसा कि ऊपर टिप्पणी की गई है, Data(contentsOf:) एक ब्लॉकिंग कॉल है और जिस थ्रेड पर इसे कॉल किया जाता है, उस पर कोई भी गतिविधि रोक दी जाएगी, जिसमें यह भी शामिल है कि इसे मुख्य थ्रेड से कहा जाता है।

URLSession फ़ंक्शन में से किसी एक का उपयोग करने के लिए स्विच करें।

एक संभावित उदाहरण:

import Combine

let url = "https://via.placeholder.com/150"
var task: AnyCancellable? // Do not let this go out of scope until data is loaded

if let validURL = URL(string: url) {
    task = URLSession.shared.dataTaskPublisher(for: validURL)
        .sink(receiveCompletion: { completion in
            // error handling
        }, receiveValue: { (data, response) in
            let image = UIImage(data: data)
            cell.cellImage.image = image
        })
}
2
picciano 30 अगस्त 2021, 18:07