1

我创建了一个应用程序组 group.com.example.FoodTracker-qg,在应用程序的主视图控制器中,我正在下载图像并存储在共享容器中,但我无法在图像视图中使用相同的图像。我收到以下错误

致命错误:“试试!” 表达式意外引发错误:Error Domain=NSCocoaErrorDomain Code=256“文件“EC700C58-E9C9-480D-8EE2-B88A570A5728image.jpg”无法打开。” UserInfo={NSURL=/private/var/mobile/Containers/Shared/AppGroup/EC700C58-E9C9-480D-8EE2-B88A570A5728image.jpg}:文件/Library/Caches/com.apple.xbs/Sources/swiftlang/swiftlang-800.0 .63/src/swift/stdlib/public/core/ErrorType.swift,第 178 行

下面是我从共享容器写入和读取的代码

//  ViewController.swift


import UIKit

class ViewController: UIViewController {

    @IBOutlet weak var mealName: UILabel!
    @IBOutlet weak var imageView: UIImageView!

    override func viewDidLoad() {
        super.viewDidLoad()
        let urlString = "https://static.pexels.com/photos/3247/nature-forest-industry-rails.jpg"
        try? Data(contentsOf: URL(string: urlString)!).write(to: getSharedFileUrl("image.jpg"))
        imageView.image = UIImage(data: try! Data(contentsOf: getSharedFileUrl("image.jpg")))                  
    }

    func getSharedFileUrl(_ fileName: String) -> URL {
        let fileManager = FileManager.default
        let url = fileManager.containerURL(forSecurityApplicationGroupIdentifier: "group.com.example.FoodTracker-qg")
        return URL(string: url!.path.appending(fileName))!
    } 
}
4

4 回答 4

4

代码似乎是正确的,您的问题可能是由于文件名本身....检查错误的网址

/private/var/mobile/Containers/Shared/AppGroup/EC700C58-E9C9-480D-8EE2-B88A570A5 728image .jpg

没有“/”...它应该看起来像 728/image.jpg

于 2017-03-06T17:15:45.863 回答
1

getSharedFileUrl(_ fileName: String) -> URL为什么要解构新检索url到的containerURL(..只是为了创建一个新的?

你可以这样做:

return url!.appending(fileName)

这应该可以解决您丢失的问题/

我不确定我是否同意这些强制换行,甚至可能会阻塞主线程Data(contentsOf: ..)

于 2017-03-06T17:21:56.300 回答
1

您的写入操作不正确。因此您无法从共享容器中读取图像。

让 appGroupIdentifier = "group.mark3"

extension Data {

    func writeToGroupContainer(filePath: String, completeHandle: @escaping (Bool, String) -> Void) {

        let url = Data.appGroupContainerURL(filePath: filePath)

        let result = FileManager.default.createFile(atPath: url.path, contents: self, attributes: nil)
        completeHandle(result, url.path)
    }

    static func appGroupContainerURL(filePath: String) -> URL {

        let fileManager = FileManager.default
        let groupURL = fileManager.containerURL(forSecurityApplicationGroupIdentifier: appGroupIdentifier)
        let url = groupURL!.appendingPathComponent(filePath)
        try? FileManager.default.createDirectory(atPath: url.deletingLastPathComponent().path, withIntermediateDirectories: true, attributes: nil)
        return url
    }

}

我们使用此扩展程序将数据正确写入您的磁盘。

override func viewDidLoad() {
    super.viewDidLoad()

    let filePath = "images/group/mark3/avatar.png"
    let data: Data = UIImagePNGRepresentation(UIImage(named: "image.png")!)!
    data.writeToGroupContainer(filePath: filePath) { (done, file) in
        print(filePath, done)
    }

}
于 2017-03-06T23:05:51.510 回答
1

append的文件名。结果,您/在路径组件之间缺少斜线,正如 JJAAXX44 正确指出的那样。

改用appendingPathComponent

func getSharedFileUrl(_ fileName: String) -> URL {
    let fileManager = FileManager.default
    guard let url = fileManager.containerURL(forSecurityApplicationGroupIdentifier: "group.com.example.FoodTracker-qg")
        else {
            fatalError() // handle error appropriate to your needs instead
    }

    return url.appendingPathComponent(fileName)
}
于 2017-03-06T20:46:00.683 回答