美文网首页Weex开发iOS开发札记iOS开发
iOS集成weex 实现加载网络图片

iOS集成weex 实现加载网络图片

作者: EmptyWalker | 来源:发表于2016-08-09 15:36 被阅读2790次

关于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)];。到此,再去运行项目,就能够显示出网络图片了。

相关文章

网友评论

  • 宁夏灼雪__:你好,我尝试用你说的方法去加载图片,跳出了一个编译问题
    "_OBJC_CLASS_$_WXTracingManager", referenced from:
    不知道能否解决
    EmptyWalker:@宁夏灼雪__ :smirk:
    宁夏灼雪__:@EmptyWalker ..已经解决了,原因是因为我的weex 不是最新版的 TAT...谢谢楼主回复
    EmptyWalker:@宁夏灼雪__ 有截图或者更多点资料吗
  • O_O_b62f:你好,我加载本地图片前几个页面可以加载,其他页面就崩溃,报这个错误'NSInvalidArgumentException', reason: '-[WXImgLoaderDefaultImpl cancel]: unrecognized selector sent to instance 0x608000007b40',你知道是怎么回事吗?
    EmptyWalker:@O_O_b62f 是不是加载失败的时候,其实这个官方插件市场有这个插件的
    O_O_b62f:@EmptyWalker 找见了,WXImageOperationProtocol遵循了这个协议,写了cancel这个方法就好了,但是我不知道这个方法是做什么的啊什么时候会调。
    EmptyWalker:https://segmentfault.com/q/1010000009290128 看看这个 加载本地图片 有新的协议方法
  • 2e919d99a871:你好楼主,我照你的方法加载出图片了,但是滑动的时候会出现 [SDWebImageDownloadToken cancel]: unrecognized selector sent to instance 0x608000428940 这个错误,这是为什么啊?
    ed21b1c2841e:/Users/sudufasongdifangdeshuofa/Downloads/xiaoshou_ios 2/SuperSale/WXImageDownloader.m:51:77: No visible @interface for 'SDWebImageManager' declares the selector 'downloadImageWithURL:options:progress:completed:'
    您好,感谢您的代码,但是 我这个方法不识别,能 纠正下吗?:grin:
    2e919d99a871:@EmptyWalker OK,找到问题了,SDWebImage版本太高了,降到了跟WeexDemo一样的版本就好了
    EmptyWalker:你好,这个现在官方的插件市场提供了一个[插件](https://market.dotwe.org/ext/list.htm#11)
    你可以去看看,省的自己加了
  • b5edf88da134:在网络图片没有加载好之前,如何让ios端对应的imageView控件显示placeHolderImage?是由IOS端来做还是H5来做?
    EmptyWalker:@渊源冤缘愿怨 placeHolderImage估计要native去实现 你的native在实现imageLoader的时候 就可以使用SDWebImage去实现 ,也就能解决placeHolder的问题了:smile:
  • Weartist:我在playground直接没找到你说的代码,,是版本不对吗
    EmptyWalker:@Weartist 继续努力 :smile: 多问题多查查 多交流哈
    Weartist:@EmptyWalker 多谢啦,我试试,刚接触两天,才弄明白
    EmptyWalker:@Weartist 有的 你看下 这是地址 https://github.com/alibaba/weex/blob/dev/ios/playground/WeexDemo/extend/handler/WXImgLoaderDefaultImpl.m
  • 6bca1a18d9ed:如何加载本地图片 就是在cache中保存的图片。。。
    6bca1a18d9ed:@EmptyWalker 谢谢~了解了
    EmptyWalker:@6bca1a18d9ed 目前weex不支持加载本地图片,但是可以加载本地URL的图片,具体可以看官方的FAQ http://alibaba.github.io/weex/doc/faq.html 这里有解释 :smile:

本文标题:iOS集成weex 实现加载网络图片

本文链接:https://www.haomeiwen.com/subject/wnrdsttx.html