* [ios] try to resolve image crash
Project: http://git-wip-us.apache.org/repos/asf/incubator-weex/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-weex/commit/2c4fdb12 Tree: http://git-wip-us.apache.org/repos/asf/incubator-weex/tree/2c4fdb12 Diff: http://git-wip-us.apache.org/repos/asf/incubator-weex/diff/2c4fdb12 Branch: refs/heads/0.16-dev Commit: 2c4fdb120a9930beaedf4e857c26f3ba09501d06 Parents: 2b97ce8 Author: acton393 <zhangxing610...@gmail.com> Authored: Tue Sep 12 22:12:19 2017 +0800 Committer: acton393 <zhangxing610...@gmail.com> Committed: Tue Sep 12 22:12:19 2017 +0800 ---------------------------------------------------------------------- .../Sources/Component/WXImageComponent.m | 33 +++++++++++++++++--- 1 file changed, 28 insertions(+), 5 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/2c4fdb12/ios/sdk/WeexSDK/Sources/Component/WXImageComponent.m ---------------------------------------------------------------------- diff --git a/ios/sdk/WeexSDK/Sources/Component/WXImageComponent.m b/ios/sdk/WeexSDK/Sources/Component/WXImageComponent.m index b7027b1..fe914fb 100644 --- a/ios/sdk/WeexSDK/Sources/Component/WXImageComponent.m +++ b/ios/sdk/WeexSDK/Sources/Component/WXImageComponent.m @@ -29,6 +29,7 @@ #import "UIBezierPath+Weex.h" #import "WXSDKEngine.h" #import "WXUtility.h" +#import <pthread/pthread.h> @interface WXImageView : UIImageView @@ -46,8 +47,12 @@ static dispatch_queue_t WXImageUpdateQueue; @interface WXImageComponent () +{ + NSString * _imageSrc; + pthread_mutex_t _imageSrcMutex; + pthread_mutexattr_t _propertMutexAttr; +} -@property (nonatomic, strong) NSString *imageSrc; @property (nonatomic, strong) NSString *placeholdSrc; @property (nonatomic, assign) CGFloat blurRadius; @property (nonatomic, assign) UIViewContentMode resizeMode; @@ -72,8 +77,15 @@ WX_EXPORT_METHOD(@selector(save:)) if (!WXImageUpdateQueue) { WXImageUpdateQueue = dispatch_queue_create("com.taobao.weex.ImageUpdateQueue", DISPATCH_QUEUE_SERIAL); } + + pthread_mutexattr_init(&(_propertMutexAttr)); + pthread_mutexattr_settype(&(_propertMutexAttr), PTHREAD_MUTEX_RECURSIVE); + pthread_mutex_init(&(_imageSrcMutex), &(_propertMutexAttr)); + if (attributes[@"src"]) { + pthread_mutex_lock(&(_imageSrcMutex)); _imageSrc = [[WXConvert NSString:attributes[@"src"]] stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]; + pthread_mutex_unlock(&(_imageSrcMutex)); } else { WXLogWarning(@"image src is nil"); } @@ -223,12 +235,14 @@ WX_EXPORT_METHOD(@selector(save:)) - (void)dealloc { [self cancelImage]; + pthread_mutex_destroy(&(_imageSrcMutex)); + pthread_mutexattr_destroy(&_propertMutexAttr); } - (void)updateAttributes:(NSDictionary *)attributes { if (attributes[@"src"]) { - _imageSrc = [[WXConvert NSString:attributes[@"src"]] stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]; + [self setImageSrc:[[WXConvert NSString:attributes[@"src"]] stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]]; [self updateImage]; } if (attributes[@"quality"]) { @@ -308,13 +322,24 @@ WX_EXPORT_METHOD(@selector(save:)) } } +- (NSString *)imageSrc +{ + pthread_mutex_lock(&(_imageSrcMutex)); + NSString * imageSrcCpy = [_imageSrc copy]; + pthread_mutex_unlock(&(_imageSrcMutex)); + + return imageSrcCpy; +} + - (void)setImageSrc:(NSString*)src { + pthread_mutex_lock(&(_imageSrcMutex)); if (![src isEqualToString:_imageSrc]) { _imageSrc = src; _imageDownloadFinish = NO; [self updateImage]; } + pthread_mutex_unlock(&(_imageSrcMutex)); } - (void)updateImage @@ -348,7 +373,6 @@ WX_EXPORT_METHOD(@selector(save:)) NSString *placeholderSrc = self.placeholdSrc; if ([WXUtility isBlankString:placeholderSrc]) { -// WXLogError(@"image placeholder src is empty"); return; } @@ -387,8 +411,7 @@ WX_EXPORT_METHOD(@selector(save:)) - (void)updateContentImageWithFailedBlock:(void(^)(NSString *, NSError *))downloadFailedBlock { - NSString *imageSrc = self.imageSrc; - + NSString *imageSrc = [NSString stringWithFormat:@"%@", self.imageSrc?:@""]; if ([WXUtility isBlankString:imageSrc]) { WXLogError(@"image src is empty"); return;