【问题标题】:Storing images locally on an iOS device在 iOS 设备上本地存储图像
【发布时间】:2013-01-10 00:19:19
【问题描述】:

一些 iOS 与照片相关的应用程序将使用该应用程序创建的图像存储在照片库以外的位置。例如,Fat Booth 显示了在应用启动时使用应用创建的照片的滚动列表。请注意,这些照片不会被用户明确保存到照片库中。 在 iOS 应用程序中保存和持久保存图像的最简单方法是什么?

我熟悉的唯一持久存储是 NSUserDefaults 和密钥链。但是,我从未听说过这些用于存储更大的数据,例如图像。现在我想知道 Core Data 是否是最简单的方法。

【问题讨论】:

    标签: ios objective-c uiimageview uiimage nsfilemanager


    【解决方案1】:

    最简单的方法是将其保存在应用程序的 Documents 目录中,并使用 NSUserDefaults 保存路径,如下所示:

    NSData *imageData = UIImagePNGRepresentation(newImage);
    
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    
    NSString *imagePath =[documentsDirectory stringByAppendingPathComponent:[NSString stringWithFormat:@"%@.png",@"cached"]];
    
    NSLog(@"pre writing to file");
    if (![imageData writeToFile:imagePath atomically:NO]) 
    {
        NSLog(@"Failed to cache image data to disk");
    }
    else
    {
        NSLog(@"the cachedImagedPath is %@",imagePath); 
    }
    

    然后将 imagePath 保存在 NSUserDefaults 中的某个字典中,或者您想要的任何内容中,然后检索它只需执行以下操作:

     NSString *theImagePath = [yourDictionary objectForKey:@"cachedImagePath"];
     UIImage *customImage = [UIImage imageWithContentsOfFile:theImagePath];
    

    【讨论】:

    • 在这里吹毛求疵,但我认为 NSPicturesDirectory 比 NSDOcumentDirectory 更合适。
    • @MarcoDinacci 为什么?它基本上只是另一个文件夹,不是吗?
    【解决方案2】:

    对于斯威夫特:

    let imageData = UIImagePNGRepresentation(selectedImage)
    let paths = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)[0] as String
    let imagePath = paths.stringByAppendingPathComponent("cached.png")
    
    if !imageData.writeToFile(imagePath, atomically: false)
    {
       println("not saved")
    } else {
       println("saved")
       NSUserDefaults.standardUserDefaults().setObject(imagePath, forKey: "imagePath")
    }
    

    对于 Swift 2.1:

    let imageData = UIImagePNGRepresentation(selectedImage)
    let documentsURL = NSFileManager.defaultManager().URLsForDirectory(.DocumentDirectory, inDomains: .UserDomainMask)[0]
    let imageURL = documentsURL.URLByAppendingPathComponent("cached.png")
    
    if !imageData.writeToURL(imageURL, atomically: false)
    {
        print("not saved")
    } else {
        print("saved")
        NSUserDefaults.standardUserDefaults().setObject(imageData, forKey: "imagePath")
    }
    

    stringByAppendingPathComponent 在 Swift 2.1 中不可用,因此您可以使用 URLByAppendingPathComponent. 获取更多信息here.

    【讨论】:

    • 问题是关于 Objective-C,而不是 Swift。
    • @JasonMArcher 我不同意,我搜索了 Objective-C,因为我找不到 Swift 的答案。这对我很有帮助,因为这是我一开始就在寻找的东西。
    • 我收到“尝试设置非属性列表对象文件”
    【解决方案3】:

    可以通过存储二进制数据来处理核心数据,但不推荐。有一个更好的方法 - 特别是对于照片。您的应用程序有一个只有您的应用程序可以访问的文档/文件目录。我建议从这里开始了解概念以及如何访问它。它相对简单。您可能希望将其与核心数据结合以存储文件路径、元数据等。http://developer.apple.com/library/mac/#documentation/FileManagement/Conceptual/FileSystemProgrammingGUide/FileSystemOverview/FileSystemOverview.html

    【讨论】:

      猜你喜欢
      • 2014-02-23
      • 1970-01-01
      • 1970-01-01
      • 2018-04-12
      • 2014-07-13
      • 2015-06-13
      • 1970-01-01
      • 2020-02-03
      • 1970-01-01
      相关资源
      最近更新 更多