将您的资源访问分解为一个单独的类。例如,这样的事情可能对您有用:
@interface CSResourceManager
+ (NSString *)pathForResource:(NSString *)resource ofType:(NSString *)type;
@end
@implementation CSResourceManager
+ (NSArray *)resourceBundles
{
NSBundle *mainBundle = [NSBundle mainBundle];
NSURL *libraryBundleURL = [mainBundle URLForResource:@"MyLibraryBundle" withExtension:@"bundle"];
NSBundle *libraryBundle = [NSBundle bundleWithURL:libraryBundleURL];
// Add more bundles here and/or cache as necessary
return @[ libraryBundle, mainBundle ];
}
+ (NSString *)pathForResource:(NSString *)resource ofType:(NSString *)type
{
NSString *path = nil;
for (NSBundle *bundle in [self resourceBundles]) {
if ((path = [[self resourceBundle] pathForResource:resource ofType:type])) {
break;
}
}
return path;
}
@end
如果每次定位资源包太慢,您可能需要缓存它,即使用静态变量。
要使用它,您现在只需编写:
NSString *path = [CSResourceManager pathForResource:@"readme" ofType:@"txt"];
除了让你的代码更容易编写之外,使用这样的类也会更容易维护(例如,如果你想更改资源包的名称,添加额外的资源存储位置或回退等)。
更新 #1:请参阅上面的修改代码以支持用于定位资源的各种“搜索路径”。
更新#2:管理资源的其他想法:
完全使用捆绑包的替代方法是让您的子项目共享资源文件的命名约定,本质上是扁平化命名空间。例如,在每个资源文件前面加上与之关联的库的名称。