iOS静态库和动态库读取图片资源

iOS静态库和动态库读取图片资源,第1张

在将私有组件打成二进制包的时候,我们可以选择打包成 静态库 或者 动态库 , 静态库 和 动态库 读取图片的方式也略有不同,同时在私有组件里面指定资源的方式也分两种,即 resources 和 resource_bundles ,下面做具体分析

1.resources

使用 resources 来指定资源,被指定的资源只会简单的被 copy 到目标工程中,如:

官方认为用 resources 是无法避免每个库和主工程之间的同名资源冲突,同时,Xcode 也不会对这些资源做优化。

2.resource_bundles

resource_bundles 允许定义当前 Pod 库的资源包的名称和文件。用 hash 的形式来声明,key 是 bundle 的名称,value 是需要包括的文件的通配 patterns。比如:

CocoaPods 官方强烈推荐使用 resource_bundles,因为用 key-value 可以避免每个库和主工程之间的同名资源冲突

1.如果使用 resourses 指定资源:

读取图片可以直接从MainBundle读取:

2.如果使用 resource_bundles 方式指定资源:

读取图片就要从自己的bundle读取,也就是OTSDebugPluginsModule.bundle:

1.如果使用 resourses 指定资源:

图片需要到自己的 frameWork 里的bundle读取:

2.如果使用 resource_bundles 方式指定资源:

读取图片同样也需要到 frameWork 里的bundle读取,但是bundle名称是OTSDebugPluginsModule.bundle:

后来试了一下不指定 OTSDebugPluginsModule.bundle 也行(注意:Xib和Storyboard不行,必须要指定OTSDebugPluginsModule.bundle):

动态库加载图片:

针对动态库和静态库通过resource_bundles获取资源,封装了一个分类UIImage+OTSAssets.h:

1.动态库获取资源

2.静态库获取资源

方案一:通过bundle获取

方案二:通过bundleName获取

有了这个分类的话,在业务组件里面获取图片资源就很方便了,比如在登录模块OTSAccountModule:

声明:

这样就可以全局使用了:

1. 库包之间的冲突问题。

2. 主App与B静态库调用A库包不同时,是否会出现其他问题。

3. 在打包ipa时,会不会出现项目过大,或者打包失败的问题。

1. 库包冲突问题已解决。(参考 上一文 )

2. 主工程导入含第三方登录的A库包,demo静态库文件导入不含第三方登录的A库包,运行未出现问题。

3. 在demo静态库调用不含第三方登录A库包方法,从打印结果可看出,demo静态库的实际是调用主工程A库包的方法。

        *  由此可以得出,demo静态库中的A静态库只是起到一个桥接的作用,实际调用的均是主工程的A库包。

4. 打包静态库,发现静态库并没有因为导入A库包而增大。(A库包8.7M,编译出来的demo静态库371KB)

5. 能正常编译出ipa包。

1. 将demo静态库导入的A库包中多余的.m文件均删除,只留下需要暴露到外界的.h文件。

2. A库包编译通过后,替换掉demo静态库中A库包,编译主工程。

3. 发现,能正常使用A库包中的方法,功能也能实现。

上述猜测成立。

方法1 --

创建一个 AFHTTPClient 实例

AFHTTPClient * client = [[AFHTTPClient alloc] initWithBaseURL:[NSURL URLWithString:@"http://api.jiepang.com"]]

// 这里一定要有一个 baseURL - 不然会抛出一个异常 --

创建一个 NSURLRequest 实例

NSDictionary * params = @{@"apiver": @"4",@"id" : @"830755858",@"extra_info": @"1"}

NSURLRequest * request = [client requestWithMethod:@"POST"

path:@"users/show"

parameters:params]

@param method 网络请求方式,比如 GET,POST,PUT,DELETE , 不能为 nil --

@param path 和 baseURL 组合成为一个 url -- 通俗的说,就是调用的接口 -- 比如,调用http://api.jiepang.com/users/show,这个接口 -- 那么 baseURL 为 http://api.jiepang.com -- path 为users/show

@param parameters 网络请求参数 -- http://api.jiepang.com/v1/users/show?id=123 -- id=123 就是这个参数

创建一个 AFHTTPRequestOperation 实例进行网络链接

AFHTTPRequestOperation * operation = [client HTTPRequestOperationWithRequest:request success:^(AFHTTPRequestOperation *operation, id responseObject) {

NSLog(@"success obj == %@",responseObject)

} failure:^(AFHTTPRequestOperation *operation, NSError *error) {

NSLog(@"faild , error == %@ ", error)

}]

[operation start]

这样 - 一次简单的调用就OK了 -

当然也可以,用封装好的其它方法 --

- (void)getPath:(NSString *)path

parameters:(NSDictionary *)parameters

success:(void (^)(AFHTTPRequestOperation *operation, id responseObject))success

failure:(void (^)(AFHTTPRequestOperation *operation, NSError *error))failure

- (void)postPath:(NSString *)path

parameters:(NSDictionary *)parameters

success:(void (^)(AFHTTPRequestOperation *operation, id responseObject))success

failure:(void (^)(AFHTTPRequestOperation *operation, NSError *error))failure

- (void)putPath:(NSString *)path

parameters:(NSDictionary *)parameters

success:(void (^)(AFHTTPRequestOperation *operation, id responseObject))success

failure:(void (^)(AFHTTPRequestOperation *operation, NSError *error))failure

- (void)deletePath:(NSString *)path

parameters:(NSDictionary *)parameters

success:(void (^)(AFHTTPRequestOperation *operation, id responseObject))success

failure:(void (^)(AFHTTPRequestOperation *operation, NSError *error))failure

- (void)patchPath:(NSString *)path

parameters:(NSDictionary *)parameters

success:(void (^)(AFHTTPRequestOperation *operation, id responseObject))success

failure:(void (^)(AFHTTPRequestOperation *operation, NSError *error))failure

方法二 --

[client getPath:path

parameters:params

success:^(AFHTTPRequestOperation *operation, id responseObject) {

NSString * obj = [[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding]

NSLog(@"obj == %@",obj)

} failure:^(AFHTTPRequestOperation *operation, NSError *error) {

NSLog(@"faild -- ")

}]

这和上面的效果是一样的 --

看到,前面返回的数据全部为 NSdata - 为添加了麻烦 -- 而且大部分的 api 返回数据都为 json --

同样 - 可以用 AFHTTPRequestOperation 的子类 AFJSONRequestOperation 来替代 --

方法三 --

NSDictionary * params = @{@"apiver": @"4",@"id" : @"830755858",@"extra_info": @"1"}

AFHTTPClient * client = [[AFHTTPClient alloc] initWithBaseURL:[NSURL URLWithString:@"http://api.jiepang.com"]]

NSURLRequest * request = [client requestWithMethod:@"POST"

path:@"users/show"

parameters:params]

AFJSONRequestOperation * operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) {

NSLog(@"json == %@",JSON)

} failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, id JSON) {

NSLog(@"faild -- ")

}]

[operation start]


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/11751771.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-18
下一篇 2023-05-18

发表评论

登录后才能评论

评论列表(0条)

保存