* [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;

Reply via email to