Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 阻止在返回或终止应用程序后再次下载图像_Swift_Firebase_Firebase Storage - Fatal编程技术网

Swift 阻止在返回或终止应用程序后再次下载图像

Swift 阻止在返回或终止应用程序后再次下载图像,swift,firebase,firebase-storage,Swift,Firebase,Firebase Storage,首先我想说的是,我在这个网站上没有找到任何关于它的信息 我想将NSURL保存到NSUserDefaults中,以防止在每个打开的应用程序或视图上加载图像。我试图做到这一点,但由于某种原因,我做不到。至少我认为应该这样做: let productImageref = productsValue[indexPath.row]["Products"] as? String cell.snusProductImageView.image = nil if let ur

首先我想说的是,我在这个网站上没有找到任何关于它的信息

我想将
NSURL
保存到
NSUserDefaults
中,以防止在每个打开的应用程序或视图上加载图像。我试图做到这一点,但由于某种原因,我做不到。至少我认为应该这样做:

let productImageref = productsValue[indexPath.row]["Products"] as? String


        cell.snusProductImageView.image = nil
        if let url =  self.productsValue[indexPath.row]["imageUrl"] as? NSURL {
            cell.snusProductImageView.kf_showIndicatorWhenLoading = true
            var storedUrl = defaults.objectForKey("imageUrl") as? NSURL
            cell.snusProductImageView.kf_setImageWithURL(storedUrl)
        }
        else {
            FIRStorage.storage().reference().child("\(productImageref!).png").downloadURLWithCompletion({(url, error)in

                if error != nil{
                    print(error)
                    return
                }else{
                    self.productsValue[indexPath.row]["imageUrl"] = url

                    self.defaults.setURL(url, forKey: "imageUrl")

                    self.productstable.reloadData()
                    dispatch_async(dispatch_get_main_queue(), {

                        })
                }
                })
        }
如果我错了,请纠正我。将url-s保存到
userdefaults
中是否应该起作用

我到底做错了什么?也许将它保存到
CoreData
中会更好,但我认为这太过分了


为什么翠鸟或SDWebImages库没有缓存它?

您必须存储URL,如下所示:

let defaults = NSUserDefaults.standardUserDefaults()
defaults.setURL(yourURL:NSURL?, forKey: "imageURL")
然后像这样读
NSUserDefaults

let defaults = NSUserDefaults.standardUserDefaults()
defaults.URLForKey("imageURL")

希望这能有所帮助。

有两件事可能会有所帮助:在将某些内容保存为默认值后使用
同步
,然后使用
URLForKey
将其取回

(并检查您正在保存的内容是否确实是
NSURL

下面是在项目中工作的示例代码;将其与您的进行比较(NSUserDefaults在游乐场中被打破):


据我所知,您希望在NSUserDefault中保存多个图像url

 let url = NSURL(string: "http://localhost/")
    var array = [NSString]()
    array.append((url?.absoluteString)!)

    NSUserDefaults.standardUserDefaults().setValue(array, forKey: "image")
    NSUserDefaults.standardUserDefaults().synchronize()

    if let fetchedURL = NSUserDefaults.standardUserDefaults().valueForKey("image") as! [String]? {
        print("\(fetchedURL[0]) returned")
        let fileUrl = NSURL(string: fetchedURL[0])
        print(fileUrl)
    } else {
        print("No URL in defaults")
    }
打印结果

返回


可选()

我强烈建议将其与SDWebImage或PINRemoteImage等工具结合使用。对于这个应用程序,有比CoreData和NSUserDefaults更好的解决方案:)噢。。最后,还有一些不是否决票。那么根据你说的,我知道下载url永远不会改变?所以我不必将它们存储到数组和userdefaults中?不,这两种URL类型(
gs://
https://
)都是稳定的。您需要使用public
https://
一个用于第三方映像加载库或缓存。实时数据库还具有脱机持久性,因此您不必在冷启动时获取URL:)Github one具有
缓存控制:max age=300
,而Firebase Storage在默认情况下没有设置缓存控制(您可以在上载文件时设置,或通过更新元数据来更改),所以我想这就是翠鸟不缓存它的原因。谢谢你提供的信息:)
 let url = NSURL(string: "http://localhost/")
    var array = [NSString]()
    array.append((url?.absoluteString)!)

    NSUserDefaults.standardUserDefaults().setValue(array, forKey: "image")
    NSUserDefaults.standardUserDefaults().synchronize()

    if let fetchedURL = NSUserDefaults.standardUserDefaults().valueForKey("image") as! [String]? {
        print("\(fetchedURL[0]) returned")
        let fileUrl = NSURL(string: fetchedURL[0])
        print(fileUrl)
    } else {
        print("No URL in defaults")
    }