2017-11-21 8 views
3

Ich lade ~ 1300 Bilder herunter. Das sind kleine Bilder, die Gesamtgröße beträgt ~ 500KB. Doch nach dem Herunterladen und sie in userdefault setzen, bekomme ich Fehler wie folgt:Wie schließen Sie geöffnete Dateien mit Swift?

libsystem_network.dylib: nw_route_get_ifindex :: Buchse (PF_ROUTE, SOCK_RAW, PF_ROUTE) fehlgeschlagen: [24] Zu viele offene Dateien

Überraschenderweise werden heruntergeladene PNG-Bilder nicht geschlossen.

ich bereits erweitert Cache-Größe über unten:

// Configuring max network request cache size 
    let memoryCapacity = 30 * 1024 * 1024 // 30MB 
    let diskCapacity = 30 * 1024 * 1024 // 30MB 
    let urlCache = URLCache(memoryCapacity: memoryCapacity, diskCapacity: diskCapacity, diskPath: "myDiscPath") 
    URLCache.shared = urlCache 

Und dies ist der Ansatz, den ich bekam Bilder zu speichern:

func storeImages(){ 
     for i in stride(from: 0, to: Cur.count, by: 1) { 
      // Saving into userDefault 
      saveIconsToDefault(row: i) 
     } 
    } 

ich den Fehler erhalten, nachdem sie alle aufgenommen in userdefault werden. Also, ich weiß, dass sie da sind.

EDIT:

FUNKTIONEN:

func getImageFromWeb(_ urlString: String, closure: @escaping (UIImage?) ->()) { 
    guard let url = URL(string: urlString) else { 
     return closure(nil) 
    } 
    let task = URLSession(configuration: .default).dataTask(with: url) { (data, response, error) in 
     guard error == nil else { 
      print("error: \(String(describing: error))") 
      return closure(nil) 
     } 
     guard response != nil else { 
      print("no response") 
      return closure(nil) 
     } 
     guard data != nil else { 
      print("no data") 
      return closure(nil) 
     } 
     DispatchQueue.main.async { 
      closure(UIImage(data: data!)) 
     } 
    }; task.resume() 
} 

func getIcon (id: String, completion: @escaping (UIImage) -> Void) { 
    var icon = UIImage() 

    let imageUrl = "https://files/static/img/\(id).png" 

     getImageFromWeb(imageUrl) { (image) in 
      if verifyUrl(urlString: imageUrl) == true { 
       if let image = image { 
        icon = image 
        completion(icon) 
       } 
      } else { 
       if let image = UIImage(named: "no_image_icon") { 
        icon = image 
        completion(icon) 
       } 
      } 
     } 
} 

USAGE:

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
    guard let cell = tableView.dequeueReusableCell(withIdentifier: "CurrencyCell", for: indexPath) as? CurrencyCell else { return UITableViewCell() } 

    if currencies.count > 0 { 
     let noVal = currencies[indexPath.row].rank ?? "N/A" 
     let nameVal = currencies[indexPath.row].name ?? "N/A" 
     let priceVal = currencies[indexPath.row].price_usd ?? "N/A" 

     getIcon(id: currencies[indexPath.row].id!, completion: { (retImg) in 
      cell.configureCell(no: noVal, name: nameVal, price: priceVal, img: retImg) 
     }) 
    } 
    return cell 
} 
+2

Speichern Sie 'UIImage' nicht in' UserDefaults'. Niemals. Vor allem nicht 1300 Bilder. – the4kman

+0

Ich freue mich über Ihre Eingabe. Aber wäre es nicht besser, wenn Sie auch darauf hinweisen, wo Sie diese hinstellen müssen? – sc13

+0

https://stackoverflow.com/questions/6238139/ios-download-and-save-image-inside-app versuchen Sie dies –

Antwort

1

URLSession(configuration: .default) Die Syntax wird für jede Anforderung eine neue URLSession zu schaffen. Erstellen Sie ein einzelnes URLSession (speichern Sie es in einer Eigenschaft), und verwenden Sie es dann für alle Anforderungen erneut. Oder, wenn Sie wirklich keine individuelle Konfiguration des URLSession tun, benutzen Sie einfach URLSession.shared:

let task = URLSession.shared.dataTask(with: url) { data, response, error in 
    ... 
} 
task.resume() 

Sie erwähnen, dass Sie 1300 Bilder in UserDefaults sind zu speichern. Das ist nicht der richtige Ort, um diese Art von Daten zu speichern oder für diese Menge an Dateien. Ich würde vorschlagen, dass Sie den Ordner "Caches" verwenden, wie in der File System Programming Guide: The Library Directory Stores App-Specific Files beschrieben.

let cacheURL = try! FileManager.default 
    .url(for: .cachesDirectory, in: .userDomainMask, appropriateFor: nil, create: true) 
    .appendingPathComponent("images") 

// create your subdirectory before you try to save files into it 
try? FileManager.default.createDirectory(at: cacheURL, withIntermediateDirectories: true) 

Seien Sie nicht versucht, sie auch im Ordner "Dokumente" zu speichern. Weitere Informationen finden Sie unter iOS Storage Best Practices.

Verwandte Themen