Lin*_*ong 5 macos xcode objective-c
我在Mac OS X中构建了一个框架和一个cocoa应用程序.该框架动态链接到应用程序.在框架的一个类中,我需要读取此框架的resources文件夹中的资源文件.下面的代码
NSString *resourcePath = [[NSBundle mainBundle] resourcePath];
NSString *characterCodeTable = [resourcePath stringByAppendingPathComponent:@"pymb.txt"];
Run Code Online (Sandbox Code Playgroud)
不起作用,因为"resourcePath"是应用程序资源文件夹的路径,而不是框架的路径.
那么如何在这个框架本身的代码中访问框架的资源文件夹呢?
顺便说一句:在框架/应用程序包中组织杂项文件有什么最佳做法吗?
使用类似解决方案时有几种反作用和副作用
[NSBundle mainBundle]
Run Code Online (Sandbox Code Playgroud)
要么
NSBundle *localBundle = [NSBundle bundleForClass:[myObject class]]
Run Code Online (Sandbox Code Playgroud)
当你的app结构就像
MyContainerApp
|------Frameworks/
|-----------------MyFramework.framwork/
|-------------------Resources/
|-------------mydata.json
Run Code Online (Sandbox Code Playgroud)
因此,如果您可以创建捆绑文件并将其提供给容器应用程序(作为第三方框架开发人员),则可以提供此API
+ (NSBundle *)frameworkBundle {
static NSBundle* frameworkBundle = nil;
static dispatch_once_t predicate;
dispatch_once(&predicate, ^{
NSString* mainBundlePath = [[NSBundle mainBundle] resourcePath];
NSString* frameworkBundlePath = [mainBundlePath stringByAppendingPathComponent:@"YourFrameworkBundle.bundle"];
frameworkBundle = [NSBundle bundleWithPath:frameworkBundlePath];
});
return frameworkBundle;
}
Run Code Online (Sandbox Code Playgroud)
但是,一个非常超级简单,让我们说超高效的解决方案是带有hexdump的旧C头
xxd -i mydata.json >> mydata.json.h
Run Code Online (Sandbox Code Playgroud)
此hexdump将生成包含这些定义的头文件
unsigned char mydata_json[] = {
// hex array
};
Run Code Online (Sandbox Code Playgroud)
和
unsigned int mydata_json_len = 32227;
Run Code Online (Sandbox Code Playgroud)
因此,在您的框架或静态库中,您只需访问它
unsigned char *rawBytes = mydata_json;
NSUInteger dataLen = mydata_json_len;
NSData *serializedData = [NSData dataWithBytesNoCopy:rawBytes length:dataLen freeWhenDone:NO];
Run Code Online (Sandbox Code Playgroud)
那么你可能想把它变成文本:
NSString* myString = [NSString stringWithUTF8String:[rawBytes bytes]];
Run Code Online (Sandbox Code Playgroud)
就是这样.快乐的编码!
| 归档时间: |
|
| 查看次数: |
7503 次 |
| 最近记录: |