2016-08-16 2 views
-3

Прежде всего, я хочу сказать, что я не нашел никаких комментариев об этом на этом сайте.Предотвращение загрузки изображений после возврата или прекращения действия приложения

Я хочу, чтобы сохранить 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, но я подумал, что это будет излишним.

Почему Kingfisher или SDWebImages библиотека не кэшировать его?

+1

Я настоятельно рекомендую взглянуть на http://stackoverflow.com/questions/38943645/uploading-downloading-multiple-images-the-right-way и использовать его в сочетании с инструментом, например SDWebImage или PINRemoteImage. Есть лучшие решения, чем CoreData и NSUserDefaults для этого приложения :) –

+0

Ooh .. наконец-то, что не является нисходящим. Итак, согласно тому, что вы сказали, я понимаю, что URL-адрес загрузки никогда не меняется? Так что мне не нужно хранить их в массиве и в userdefaults? –

+1

Нет, оба типа URL ('gs: //' и 'https: //') являются стабильными. Вы захотите использовать общедоступный 'https: //' один для загрузки сторонних изображений или для кеширования. База данных Realtime также имеет автономную стойкость, поэтому вам не нужно получать URL-адрес при холодном запуске :) –

ответ

1

Вы должен хранить URL, как показано ниже:

let defaults = NSUserDefaults.standardUserDefaults() 
defaults.setURL(yourURL:NSURL?, forKey: "imageURL") 

И прочитал NSUserDefaults так:

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

Надеется, что это помогает.

+0

обновленный мой ответ, пожалуйста, посмотрите –

1

Две вещи, которые могут помочь: используйте synchronize после сохранения чего-либо по умолчанию и используйте URLForKey, чтобы вернуть его.

(И проверить, что вещь, вы экономите на самом деле является NSURL.)

Вот пример кода, который работает в проекте; сравнить его с вашим (NSUserDefaults сломана для игровых площадок.):

let defaults = NSUserDefaults.standardUserDefaults() 
    if let components = NSURLComponents(string: "http://localhost/"), 
     url = components.URL { 
     defaults.setURL(url, forKey: "imageUrl") 
     defaults.synchronize() 
     if let fetchedURL = defaults.URLForKey("imageUrl") { 
      print("\(fetchedURL) returned") 
     } else { 
      print("No URL in defaults") 
     } 
    } else { 
     print("Bad components") 
    } 
    print(defaults.dictionaryRepresentation()) 
0

Как я понял, вы хотите сохранить несколько изображений URL в NSUserDefaults

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") 
    } 

печать результаты

http://localhost/ вернулся

Дополнительный (http://localhost/)

Смежные вопросы