This is an automated email from the ASF dual-hosted git repository.

moshen pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-weex.git


The following commit(s) were added to refs/heads/master by this push:
     new e4c48f5  [iOS] fix multi jsthread error
     new 75d1004  Merge pull request #2770 from jianhan-he/master
e4c48f5 is described below

commit e4c48f585b3b4b6df7ae9451079f92f7d3748e9f
Author: linghe.lh <[email protected]>
AuthorDate: Thu Aug 1 10:17:28 2019 +0800

    [iOS] fix multi jsthread error
---
 ios/sdk/WeexSDK/Sources/Manager/WXBridgeManager.h |   2 +
 ios/sdk/WeexSDK/Sources/Manager/WXBridgeManager.m | 124 ++++++++++++++++++----
 ios/sdk/WeexSDK/Sources/Model/WXSDKInstance.m     |   6 ++
 3 files changed, 110 insertions(+), 22 deletions(-)

diff --git a/ios/sdk/WeexSDK/Sources/Manager/WXBridgeManager.h 
b/ios/sdk/WeexSDK/Sources/Manager/WXBridgeManager.h
index 80ecee8..253cc95 100644
--- a/ios/sdk/WeexSDK/Sources/Manager/WXBridgeManager.h
+++ b/ios/sdk/WeexSDK/Sources/Manager/WXBridgeManager.h
@@ -242,4 +242,6 @@ extern "C" {
 
 - (void)callJSMethod:(NSString *)method args:(NSArray *)args;
 
+- (void)executeJSTaskQueue;
+
 @end
diff --git a/ios/sdk/WeexSDK/Sources/Manager/WXBridgeManager.m 
b/ios/sdk/WeexSDK/Sources/Manager/WXBridgeManager.m
index 4cab6a6..ea33004 100644
--- a/ios/sdk/WeexSDK/Sources/Manager/WXBridgeManager.m
+++ b/ios/sdk/WeexSDK/Sources/Manager/WXBridgeManager.m
@@ -41,9 +41,11 @@
 @interface WXBridgeManager ()
 
 @property (nonatomic, assign) BOOL stopRunning;
+@property (nonatomic, assign) BOOL supportMultiJSThread;
 @property (nonatomic, strong) WXBridgeContext *bridgeCtx;
 @property (nonatomic, strong) WXBridgeContext *backupBridgeCtx;
 @property (nonatomic, strong) WXThreadSafeMutableArray *instanceIdStack;
+@property (nonatomic, strong) NSMutableArray* jsTaskQueue;
 
 @end
 
@@ -67,11 +69,24 @@ static NSThread *WXBackupBridgeThread;
     self = [super init];
     if (self) {
         _bridgeCtx = [[WXBridgeContext alloc] init];
-        _backupBridgeCtx = [[WXBridgeContext alloc] init];
+        _supportMultiJSThread = YES;
+        _jsTaskQueue = [NSMutableArray array];
     }
     return self;
 }
 
+- (WXBridgeContext *)backupBridgeCtx {
+    if (_backupBridgeCtx) {
+        return _backupBridgeCtx;
+    }
+    if (!_supportMultiJSThread) {
+        _backupBridgeCtx = _bridgeCtx;
+    } else {
+        _backupBridgeCtx = [[WXBridgeContext alloc] init];
+    }
+    return _backupBridgeCtx;
+}
+
 - (WXSDKInstance *)topInstance
 {
     return _bridgeCtx.topInstance;
@@ -122,34 +137,41 @@ static NSThread *WXBackupBridgeThread;
     return WXBackupBridgeThread;
 }
 
-void WXPerformBlockOnBridgeThreadForInstance(void (^block)(void), NSString* 
instance) {
-    [WXBridgeManager _performBlockOnBridgeThread:block instance:instance];
-}
-
 void WXPerformBlockOnBridgeThread(void (^block)(void))
 {
-    [WXBridgeManager _performBlockOnBridgeThread:block instance:nil];
+    [WXBridgeManager _performBlockOnBridgeThread:block];
 }
 
-void WXPerformBlockOnBackupBridgeThread(void (^block)(void))
-{
-    [WXBridgeManager _performBlockOnBackupBridgeThread:block instance:nil];
+void WXPerformBlockOnBridgeThreadForInstance(void (^block)(void), NSString* 
instance) {
+    [WXBridgeManager _performBlockOnBridgeThread:block instance:instance];
 }
 
-+ (void)_performBlockOnBackupBridgeThread:(void (^)(void))block 
instance:(NSString*)instanceId
++ (void)_performBlockOnBridgeThread:(void (^)(void))block
 {
-    if ([NSThread currentThread] == [self backupJsThread]) {
+    if ([NSThread currentThread] == [self jsThread]) {
         block();
     } else {
         [self performSelector:@selector(_performBlockOnBridgeThread:instance:)
-                     onThread:[self backupJsThread]
-                   withObject:[block copy]
-                waitUntilDone:NO];
+                         onThread:[self jsThread]
+                       withObject:[block copy]
+                    waitUntilDone:NO];
     }
 }
 
 + (void)_performBlockOnBridgeThread:(void (^)(void))block 
instance:(NSString*)instanceId
 {
+    if (![WXSDKManager bridgeMgr].supportMultiJSThread) {
+        if ([NSThread currentThread] == [self jsThread]) {
+            block();
+        } else {
+            [self 
performSelector:@selector(_performBlockOnBridgeThread:instance:)
+                         onThread:[self jsThread]
+                       withObject:[block copy]
+                    waitUntilDone:NO];
+       }
+        return;
+    }
+
     if ([NSThread currentThread] == [self jsThread] || [NSThread 
currentThread] == [self backupJsThread]) {
         block();
     } else {
@@ -160,25 +182,73 @@ void WXPerformBlockOnBackupBridgeThread(void 
(^block)(void))
 
         if (instance && instance.useBackupJsThread) {
             [self 
performSelector:@selector(_performBlockOnBridgeThread:instance:)
-                             onThread:[self backupJsThread]
-                           withObject:[block copy]
-                        waitUntilDone:NO];
+                         onThread:[self backupJsThread]
+                       withObject:[block copy]
+                    waitUntilDone:NO];
         } else {
             [self 
performSelector:@selector(_performBlockOnBridgeThread:instance:)
-                             onThread:[self jsThread]
-                           withObject:[block copy]
-                        waitUntilDone:NO];
+                         onThread:[self jsThread]
+                       withObject:[block copy]
+                    waitUntilDone:NO];
         }
     }
 }
 
+void WXPerformBlockOnBackupBridgeThread(void (^block)(void))
+{
+    [WXBridgeManager _performBlockOnBackupBridgeThread:block 
putInTaskQueue:YES];
+}
+
++ (void)_performBlockOnBackupBridgeThread:(void (^)(void))block 
putInTaskQueue:(BOOL)putInTaskQueue
+{
+    if (![WXSDKManager bridgeMgr].supportMultiJSThread) {
+        return;
+    }
+    if (putInTaskQueue) {
+        [[WXSDKManager bridgeMgr].jsTaskQueue addObject:block];
+    } else {
+        [self performSelector:@selector(_performBlockOnBridgeThread:instance:)
+                     onThread:[self backupJsThread]
+                   withObject:[block copy]
+                waitUntilDone:NO];
+    }
+}
+
+void WXPerformBlockSyncOnBridgeThread(void (^block) (void)) {
+    [WXBridgeManager _performBlockSyncOnBridgeThread:block];
+}
+
 void WXPerformBlockSyncOnBridgeThreadForInstance(void (^block) (void), 
NSString* instance)
 {
     [WXBridgeManager _performBlockSyncOnBridgeThread:block instance:instance];
 }
 
++ (void)_performBlockSyncOnBridgeThread:(void (^)(void))block
+{
+    if ([NSThread currentThread] == [self jsThread]) {
+        block();
+    } else {
+        [self performSelector:@selector(_performBlockSyncOnBridgeThread:)
+                     onThread:[self jsThread]
+                   withObject:[block copy]
+                waitUntilDone:YES];
+    }
+}
+
 + (void)_performBlockSyncOnBridgeThread:(void (^)(void))block 
instance:(NSString*)instanceId
 {
+    if (![WXSDKManager bridgeMgr].supportMultiJSThread) {
+        if ([NSThread currentThread] == [self jsThread]) {
+            block();
+        } else {
+            [self 
performSelector:@selector(_performBlockSyncOnBridgeThread:instance:)
+                         onThread:[self jsThread]
+                       withObject:[block copy]
+                    waitUntilDone:YES];
+        }
+        return;
+    }
+
     if ([NSThread currentThread] == [self jsThread] || [NSThread 
currentThread] == [self backupJsThread]) {
         block();
     } else {
@@ -188,12 +258,12 @@ void WXPerformBlockSyncOnBridgeThreadForInstance(void 
(^block) (void), NSString*
         }
 
         if (instance && instance.useBackupJsThread) {
-            [self 
performSelector:@selector(_performBlockOnBridgeThread:instance:)
+            [self 
performSelector:@selector(_performBlockSyncOnBridgeThread:instance:)
                          onThread:[self backupJsThread]
                        withObject:[block copy]
                     waitUntilDone:YES];
         } else {
-            [self 
performSelector:@selector(_performBlockOnBridgeThread:instance:)
+            [self 
performSelector:@selector(_performBlockSyncOnBridgeThread:instance:)
                          onThread:[self jsThread]
                        withObject:[block copy]
                     waitUntilDone:YES];
@@ -279,6 +349,16 @@ void WXPerformBlockSyncOnBridgeThreadForInstance(void 
(^block) (void), NSString*
     }, instance);
 }
 
+- (void)executeJSTaskQueue {
+    if (_jsTaskQueue.count == 0 || !_supportMultiJSThread) {
+        return;
+    }
+    for (id block in _jsTaskQueue) {
+        [WXBridgeManager _performBlockOnBackupBridgeThread:block 
putInTaskQueue:NO];
+    }
+    [_jsTaskQueue removeAllObjects];
+}
+
 - (WXThreadSafeMutableArray *)instanceIdStack
 {
     if (_instanceIdStack) return _instanceIdStack;
diff --git a/ios/sdk/WeexSDK/Sources/Model/WXSDKInstance.m 
b/ios/sdk/WeexSDK/Sources/Model/WXSDKInstance.m
index 4781615..d23b60a 100644
--- a/ios/sdk/WeexSDK/Sources/Model/WXSDKInstance.m
+++ b/ios/sdk/WeexSDK/Sources/Model/WXSDKInstance.m
@@ -308,6 +308,9 @@ typedef enum : NSUInteger {
         return;
     }
     [WXCoreBridge install];
+    if (_useBackupJsThread) {
+        [[WXSDKManager bridgeMgr] executeJSTaskQueue];
+    }
 
     self.scriptURL = url;
     [self _checkPageName];
@@ -327,6 +330,9 @@ typedef enum : NSUInteger {
     _options = [options isKindOfClass:[NSDictionary class]] ? options : nil;
     _jsData = data;
     [WXCoreBridge install];
+    if (_useBackupJsThread) {
+        [[WXSDKManager bridgeMgr] executeJSTaskQueue];
+    }
 
     self.needValidate = [[WXHandlerFactory 
handlerForProtocol:@protocol(WXValidateProtocol)] needValidate:self.scriptURL];
 

Reply via email to