如何使用Swift关闭打开的文件?

我正在下载〜1300张图片。 这些是小图像,总大小约为500KB。 但是,下载并将它们放入userDefault后,我收到如下错误:

libsystem_network.dylib:nw_route_get_ifindex :: socket(PF_ROUTE,SOCK_RAW,PF_ROUTE)失败:[24]打开文件太多

很明显,下载的png图像没有被关闭。

我已经通过以下扩展了缓存大小:

// 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 

这是我存储图像的方法:

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

将所有这些错误添加到userDefault后,我收到错误。 所以,我知道他们在那里。

编辑:

function:

 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 = "http://sofzh.miximages.com/ios/(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) } } } } 

用法:

 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 } 

URLSession(configuration: .default)语法为每个请求创建一个新的URLSession 。 创建一个URLSession (将其保存在某个属性中),然后将其重用于所有请求。 或者,如果您真的没有对URLSession进行任何自定义配置,只需使用URLSession.shared

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

您提到您在UserDefaults保存了1300张图像。 这不是存储该类型数据的正确位置,也不是存储该数量的文件的正确位置。 我建议您使用文件系统编程指南中概述的“Caches”文件夹:库目录存储特定于应用程序的文件 。

 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) 

不要试图将它们存储在“Documents”文件夹中。 有关更多信息,请参阅iOS存储最佳实践 。