【问题标题】:Get image paths from NSBundle in Objective C?从Objective C中的NSBundle获取图像路径?
【发布时间】:2011-05-01 22:58:45
【问题描述】:

我有大约 60 张图片要存储在 Core Data 中,其中 30 张是头像,前缀为 avt_filename_00X.png,其中 30 张较小且前缀不同。

我不想将所有图像存储为 Core Data/SQLite 中的 BLOB,而是存储找到的每个图像的路径(与存储 MySQL 数据库的图像路径相同)。

但是我不确定如何获取在 NSBundle 中找到的图像路径。

我可以通过以下方式获取到 NSDocumentDirectory 的路径:

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];

NSFileManager *fileManager = [NSFileManager defaultManager];
[fileManager fileExistsAtPath:documentsDirectory];

NSLog(@"documentsDirectory = %@", documentsDirectory);

我可以加载图像并将其添加到数组中。

if (qty == 0)
{
    //NSLog(@"fileToLoad = %@", fileToLoad);

    UIImage *img = [[UIImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:fileToLoad ofType:fileExt]];

    [self.avtList addObject:img];

    [img release];

} else {

    // load multiple image into an array
    // not coded yet
}

但是,我不确定的是:

  1. 如何获取计算机在 NSBundle 中找到图像的路径?

  2. 当应用程序在设备上时,我如何确保路径可以正常工作?

我们的想法是将所有图像存储在一个数组中,然后稍后将它们推送到 Core Data/SQLite。

【问题讨论】:

    标签: objective-c image core-data path nsbundle


    【解决方案1】:

    我怎样才能确定路径会 当应用在设备上时工作?

    问题就在这里:你不能。您最好让路径被即时处理,也许只存储文件名。

    【讨论】:

    • 哦,我不知道。我认为您可以使用存储完整路径然后使用它。如果我写它来存储文件名和文件路径,我是否需要在对其进行任何操作之前检查它是否存在?
    • 当然可以,因为除了您自己的计算机之外,它在其他任何地方正常工作的可能性非常小。例如,如果用户将应用程序放在他们的 /Users/username/Applications 文件夹中,那么更改用户名将使存储的路径变得无用。
    【解决方案2】:

    在主包中获取资源完整路径的正确方法是:

    [[NSBundle mainBundle] pathForResource:@"avt_filename_00X" ofType:@"png"]
    

    (如果您希望在资源名称中包含扩展名,也可以为“ofType”提供空字符串)

    但文档中没有任何地方保证在设备、操作系统迭代等之间保持相同的路径。它是从当前环境中的应用程序包到该文件的路径,保证在此运行期间保持有效仅限应用程序。

    由于不能保证应用程序及其资源的路径保持不变,我认为无论如何将其放在 SQL 数据库中都是不安全的。

    您是否可以采用一种方案,其中以 / 开头的文件名是完整路径,假设开头没有 / 的文件名在捆绑包中,这意味着您可以在数据库外部应用逻辑?

    【讨论】:

    • 是的,这是有道理的。我想我只是将文件名存储在数据库中,然后在稍后阶段使用您的 NSBundle 代码来获取图像。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多