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];