इसलिए, मैं फायरबेस से पुनर्प्राप्त छवियों को कैश करने का प्रयास कर रहा हूं:

class AccountSettings: UITableViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate{

@IBOutlet weak var profileImage: UIImageView!
var imageRef: StorageReference{
    return Storage.storage().reference().child("profile_images")
}

let cache = NSCache<NSString, UIImage>()
var activityIndicator = UIActivityIndicatorView()

override func viewDidLoad() {
    activityIndicator = UIActivityIndicatorView(activityIndicatorStyle: .gray)
    activityIndicator.frame = CGRect(x: 0, y: 0, width: 46, height: 46)
    activityIndicator.hidesWhenStopped = true

    profileImage.addSubview(activityIndicator)
    activityIndicator.startAnimating()


    if let image = cache.object(forKey: "\(UserDefaults.standard.string(forKey: "unique_id")!).jpg" as NSString){
        profileImage.image = image
    }else{
        retrieveCurrentProfileImg()
    }

}

func retrieveCurrentProfileImg(){
    let downloadImageRef = imageRef.child("\(UserDefaults.standard.string(forKey: "unique_id")!).jpg")

    let downloadTask = downloadImageRef.getData(maxSize: 1024*1024*12) { (data, error) in
        if let data = data{
            let image = UIImage(data: data)
            self.profileImage.image = image
            self.cache.setObject(image!, forKey: "\(UserDefaults.standard.string(forKey: "unique_id")!).jpg" as NSString)
            self.activityIndicator.stopAnimating()
        }

        print(error ?? "No error")

    }
    downloadTask.observe(.progress) { (snapshot) in

    }
    downloadTask.resume()

}

}

पहली बार दिखाई देने पर, दृश्य छवि को लोड करता है, लेकिन अगली बार दृश्य दिखाई देने पर ऐसा होता है:

  • छवि कैश से लोड नहीं होगी
  • मुझे निम्नलिखित त्रुटि मिलती है: Error

मैंने देखा कि यह "कोई त्रुटि नहीं" प्रिंट करने के बाद दुर्घटनाग्रस्त हो जाता है।

मैं जानना चाहता हूं कि मेरी समस्या का कारण क्या है और मैं इसे कैसे हल कर सकता हूं। मुझे लगता है कि इसका पूरा होने वाले हैंडलर के साथ कुछ करना है, क्योंकि त्रुटि रेखा का तात्पर्य है।

मैंने कैश को मेरे पूर्णता के अंदर सेट करने का भी प्रयास किया है, लेकिन कुछ भी नहीं होता है। मैं क्या गलत कर रहा हूं?

2
Test tester 20 जुलाई 2018, 03:50
क्या आपने कार्य प्रगति पर होने के दौरान अपने व्यू कंट्रोलर के अंदर मजबूत गुणों के लिए downloadImageRef और/या डाउनलोड टास्क असाइन करने का प्रयास किया है? दुर्घटना से, ऐसा लगता है कि किसी एक को समय से पहले ही हटा दिया जा रहा है।
 – 
robinkunde
20 जुलाई 2018, 05:35
मुझे यह कैसे करना है? मैंने पढ़ा है कि यह डिफ़ॉल्ट रूप से मजबूत है।
 – 
Test tester
20 जुलाई 2018, 14:45
वे हैं, मैं सिर्फ इस बात पर जोर देना चाहता था कि उन्हें मजबूत होने की जरूरत है। अभी वे केवल स्थानीय चरों में स्टोर कर रहे हैं जिन्हें पुनर्प्राप्तिCurrentProfileImg के अंत में हटा दिया गया है। उदाहरण के गुणों में उन्हें संग्रहीत करके, आप मूल्यों के जीवनकाल को तब तक बढ़ाते हैं जब तक कि आप गुणों को मैन्युअल रूप से शून्य पर सेट नहीं करते हैं या दृश्य नियंत्रक स्वयं ही हटा दिया जाता है।
 – 
robinkunde
20 जुलाई 2018, 20:07

2 जवाब

कृपया जांचें कि क्या fetcherCompletion जंगली सूचक है, जैसे NSLog(@"%@",weakSelf.fetcherCompletion) जोड़ना

अगर यह सच है, तो शायद यह फायरबेस की बग है। fetcherCompletion की संपत्ति को copy या strong जोड़ना चाहिए।

1
selton 20 जुलाई 2018, 10:19
4 संस्करण हैं (कमजोर स्वयं, भ्रूण पूर्णता, डेटा, त्रुटि) पहली बात यह पता लगाना है कि कौन सा संस्करण जंगली सूचक है। क्या यह कोड NSLog(@"%@",weakSelf.fetcherCompletion) क्रैश हो जाता है?
 – 
selton
20 जुलाई 2018, 15:10

मुझे नहीं पता क्यों, लेकिन ऐसा लगता है कि यह चाल चल रही है:

func retrieveCurrentProfileImg(){
    var downloadImageRef = imageRef.child("\(UserDefaults.standard.string(forKey: "unique_id")!).jpg")
    print(downloadImageRef)
    downloadImageRef.getData(maxSize: 1024*1024*12) { (dataResponse, errorResponse) in
        if let data = dataResponse{
            let image = UIImage(data: data)
            self.profileImage?.image = image
        }

        print(errorResponse ?? "No error")
    }
}

अगर कोई समझा सकता है कि यह क्यों काम करता है, तो इसकी सराहना की जाएगी :)

0
André Kool 20 जुलाई 2018, 16:04