iOS集成weex 实现加载网络图片
关于weex集成到Xcode的过程,可以参考官方文档iOS集成步骤。我在这里记录一下,官方文档没有明确说明但在实际开发过程中需要用到的问题。
解决问题后的代码
描述
在weex集成到Xcode中,运行官方文档提供的we文件,在terminal
中通过weex xx.we -o xx.js后,记载该js文件,发现图片不显示。我去weex的中文聊天室问了一下,然后weex团队成员告诉我要从新写图片加载器,让我参考weex的playground代码。
过程
在playground中,我发现一段代码(之所以发现这段代码,是因为在集成weex中最基本的代码不包含他们)
[WXSDKEngine registerHandler:[WXImgLoaderDefaultImpl new] withProtocol:@protocol(WXImgLoaderProtocol)];
[WXSDKEngine registerHandler:[WXEventModule new] withProtocol:@protocol(WXEventModuleProtocol)];
[WXSDKEngine registerComponent:@"select" withClass:NSClassFromString(@"WXSelectComponent")];
[WXSDKEngine registerModule:@"event" withClass:[WXEventModule class]];
[self atAddPlugin];
这里有4个注册,根据协议名称,可以判断WXImgLoaderProtocol
就应该是图片加载协议,然后我去找了WXImgLoaderDefaultImpl
这个类的实现。
WXImgLoaderDefaultImpl.h
文件
/**
* Created by Weex.
* Copyright (c) 2016, Alibaba, Inc. All rights reserved.
*
* This source code is licensed under the Apache Licence 2.0.
* For the full copyright and license information,please view the LICENSE file in the root directory of this source tree.
*/
#import <Foundation/Foundation.h>
#import "WXImgLoaderProtocol.h"
@interface WXImgLoaderDefaultImpl : NSObject<WXImgLoaderProtocol, WXModuleProtocol>
@end
WXImgLoaderDefaultImpl.m
文件
/**
* Created by Weex.
* Copyright (c) 2016, Alibaba, Inc. All rights reserved.
*
* This source code is licensed under the Apache Licence 2.0.
* For the full copyright and license information,please view the LICENSE file in the root directory of this source tree.
*/
#import "WXImgLoaderDefaultImpl.h"
#import <SDWebImage/UIImageView+WebCache.h>
#define MIN_IMAGE_WIDTH 36
#define MIN_IMAGE_HEIGHT 36
#if OS_OBJECT_USE_OBJC
#undef WXDispatchQueueRelease
#undef WXDispatchQueueSetterSementics
#define WXDispatchQueueRelease(q)
#define WXDispatchQueueSetterSementics strong
#else
#undef WXDispatchQueueRelease
#undef WXDispatchQueueSetterSementics
#define WXDispatchQueueRelease(q) (dispatch_release(q))
#define WXDispatchQueueSetterSementics assign
#endif
@interface WXImgLoaderDefaultImpl()
@property (WXDispatchQueueSetterSementics, nonatomic) dispatch_queue_t ioQueue;
@end
@implementation WXImgLoaderDefaultImpl
#pragma mark -
#pragma mark WXImgLoaderProtocol
- (id<WXImageOperationProtocol>)downloadImageWithURL:(NSString *)url imageFrame:(CGRect)imageFrame userInfo:(NSDictionary *)userInfo completed:(void(^)(UIImage *image, NSError *error, BOOL finished))completedBlock
{
if ([url hasPrefix:@"//"]) {
url = [@"http:" stringByAppendingString:url];
}
return (id<WXImageOperationProtocol>)[[SDWebImageManager sharedManager] downloadImageWithURL:[NSURL URLWithString:url] options:0 progress:^(NSInteger receivedSize, NSInteger expectedSize) {
} completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, BOOL finished, NSURL *imageURL) {
if (completedBlock) {
completedBlock(image, error, finished);
}
}];
}
@end
分析
从该类的代码中,可以发现:这个本地的图片加载类是遵守了WXImgLoaderProtocol
协议,并实现了- (id<WXImageOperationProtocol>)downloadImageWithURL:(NSString *)url imageFrame:(CGRect)imageFrame userInfo:(NSDictionary *)options completed:(void(^)(UIImage *image, NSError *error, BOOL finished))completedBlock;
方法。在WXImgLoaderDefaultImpl.m
中,官方使用的是SDWebImage去加载网络图片的。这个地方采用其他加载图片的方法也是可以的。
结论
如果想要Xcode中能够显示出,网络图片,需要从新写一个图片加载器,该加载器需要遵守WXImgLoaderProtocol
协议,并实现加载方法。不过在我的这个加载器的时候,发现如果只写上述方法,会出现警告,因为该协议还有一个- (void)cancel;
方法,也需要实现。当加载器写好之后需要在入口类中注册一下[WXSDKEngine registerHandler:[YHImageLoader new] withProtocol:@protocol(WXImgLoaderProtocol)];
。到此,再去运行项目,就能够显示出网络图片了。