+ [ios] update tracing logic @notdanger

Project: http://git-wip-us.apache.org/repos/asf/incubator-weex/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-weex/commit/7c3b6cfc
Tree: http://git-wip-us.apache.org/repos/asf/incubator-weex/tree/7c3b6cfc
Diff: http://git-wip-us.apache.org/repos/asf/incubator-weex/diff/7c3b6cfc

Branch: refs/heads/0.15-dev
Commit: 7c3b6cfc6c47be3811cf3313db231550f40296d3
Parents: 11b1949
Author: 齐山 <sunjjb...@163.com>
Authored: Wed Jul 19 10:09:06 2017 +0800
Committer: 齐山 <sunjjb...@163.com>
Committed: Wed Jul 19 10:09:06 2017 +0800

----------------------------------------------------------------------
 ios/sdk/WeexSDK.xcodeproj/project.pbxproj       |   8 +
 .../WeexSDK/Sources/Bridge/WXBridgeContext.m    |  25 +-
 .../WeexSDK/Sources/Manager/WXTracingManager.h  |  83 +++++
 .../WeexSDK/Sources/Manager/WXTracingManager.m  | 370 +++++++++++++++++++
 ios/sdk/WeexSDK/Sources/Module/WXDomModule.m    |  14 +-
 .../WeexSDK/Sources/Utility/WXTracingManager.h  |  86 -----
 .../WeexSDK/Sources/Utility/WXTracingManager.m  | 353 ------------------
 7 files changed, 465 insertions(+), 474 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/7c3b6cfc/ios/sdk/WeexSDK.xcodeproj/project.pbxproj
----------------------------------------------------------------------
diff --git a/ios/sdk/WeexSDK.xcodeproj/project.pbxproj 
b/ios/sdk/WeexSDK.xcodeproj/project.pbxproj
index d16e630..43256cc 100644
--- a/ios/sdk/WeexSDK.xcodeproj/project.pbxproj
+++ b/ios/sdk/WeexSDK.xcodeproj/project.pbxproj
@@ -250,6 +250,8 @@
                C4D872261E5DDF7500E39BC1 /* WXBoxShadow.m in Sources */ = {isa 
= PBXBuildFile; fileRef = C4D872241E5DDF7500E39BC1 /* WXBoxShadow.m */; };
                C4E375371E5FCBD3009B2D9C /* WXComponent+BoxShadow.m in Sources 
*/ = {isa = PBXBuildFile; fileRef = C4E375351E5FCBD3009B2D9C /* 
WXComponent+BoxShadow.m */; };
                C4E375381E5FCBD3009B2D9C /* WXComponent+BoxShadow.h in Headers 
*/ = {isa = PBXBuildFile; fileRef = C4E375361E5FCBD3009B2D9C /* 
WXComponent+BoxShadow.h */; };
+               C4E97D331F1EF46D00ABC314 /* WXTracingManager.h in Headers */ = 
{isa = PBXBuildFile; fileRef = C4E97D311F1EF46D00ABC314 /* WXTracingManager.h 
*/; };
+               C4E97D341F1EF46D00ABC314 /* WXTracingManager.m in Sources */ = 
{isa = PBXBuildFile; fileRef = C4E97D321F1EF46D00ABC314 /* WXTracingManager.m 
*/; };
                C4F012791E1502A6003378D0 /* SRWebSocket+Weex.h in Headers */ = 
{isa = PBXBuildFile; fileRef = C4F012721E1502A6003378D0 /* SRWebSocket+Weex.h 
*/; };
                C4F0127A1E1502A6003378D0 /* SRWebSocket+Weex.m in Sources */ = 
{isa = PBXBuildFile; fileRef = C4F012731E1502A6003378D0 /* SRWebSocket+Weex.m 
*/; };
                C4F0127B1E1502A6003378D0 /* WXWebSocketDefaultImpl.h in Headers 
*/ = {isa = PBXBuildFile; fileRef = C4F012741E1502A6003378D0 /* 
WXWebSocketDefaultImpl.h */; };
@@ -567,6 +569,8 @@
                C4D872241E5DDF7500E39BC1 /* WXBoxShadow.m */ = {isa = 
PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path 
= WXBoxShadow.m; sourceTree = "<group>"; };
                C4E375351E5FCBD3009B2D9C /* WXComponent+BoxShadow.m */ = {isa = 
PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path 
= "WXComponent+BoxShadow.m"; sourceTree = "<group>"; };
                C4E375361E5FCBD3009B2D9C /* WXComponent+BoxShadow.h */ = {isa = 
PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = 
"WXComponent+BoxShadow.h"; sourceTree = "<group>"; };
+               C4E97D311F1EF46D00ABC314 /* WXTracingManager.h */ = {isa = 
PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = 
WXTracingManager.h; sourceTree = "<group>"; };
+               C4E97D321F1EF46D00ABC314 /* WXTracingManager.m */ = {isa = 
PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path 
= WXTracingManager.m; sourceTree = "<group>"; };
                C4F012721E1502A6003378D0 /* SRWebSocket+Weex.h */ = {isa = 
PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = 
"SRWebSocket+Weex.h"; sourceTree = "<group>"; };
                C4F012731E1502A6003378D0 /* SRWebSocket+Weex.m */ = {isa = 
PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path 
= "SRWebSocket+Weex.m"; sourceTree = "<group>"; };
                C4F012741E1502A6003378D0 /* WXWebSocketDefaultImpl.h */ = {isa 
= PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path 
= WXWebSocketDefaultImpl.h; sourceTree = "<group>"; };
@@ -948,6 +952,8 @@
                77D1611A1C02DD3C0010B15B /* Manager */ = {
                        isa = PBXGroup;
                        children = (
+                               C4E97D311F1EF46D00ABC314 /* WXTracingManager.h 
*/,
+                               C4E97D321F1EF46D00ABC314 /* WXTracingManager.m 
*/,
                                740451E81E14BB26004157CB /* WXServiceFactory.h 
*/,
                                740451E91E14BB26004157CB /* WXServiceFactory.m 
*/,
                                DCF0875F1DCAE161005CD6EB /* 
WXInvocationConfig.h */,
@@ -1240,6 +1246,7 @@
                                591DD3321D23AD5800BE8709 /* WXErrorView.h in 
Headers */,
                                D362F94F1C83EDA20003F546 /* WXWebViewModule.h 
in Headers */,
                                C4F012861E150307003378D0 /* WXWebSocketLoader.h 
in Headers */,
+                               C4E97D331F1EF46D00ABC314 /* WXTracingManager.h 
in Headers */,
                                77D161381C02DE940010B15B /* WXBridgeManager.h 
in Headers */,
                                C4D872251E5DDF7500E39BC1 /* WXBoxShadow.h in 
Headers */,
                                042013AD1E66CD6A001FC79C /* 
WXValidateProtocol.h in Headers */,
@@ -1634,6 +1641,7 @@
                                7463192A1C71B92600EFEBD4 /* WXModalUIModule.m 
in Sources */,
                                77D161501C02E3880010B15B /* WXUtility.m in 
Sources */,
                                74A4BA9F1CB3C0A100195969 /* WXHandlerFactory.m 
in Sources */,
+                               C4E97D341F1EF46D00ABC314 /* WXTracingManager.m 
in Sources */,
                                742AD72F1DF98C45007DC46C /* WXResourceRequest.m 
in Sources */,
                                7461F8931CFB373100F62D44 /* WXLayer.m in 
Sources */,
                                74D205211E091B8000128F44 /* WXCallJSMethod.m in 
Sources */,

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/7c3b6cfc/ios/sdk/WeexSDK/Sources/Bridge/WXBridgeContext.m
----------------------------------------------------------------------
diff --git a/ios/sdk/WeexSDK/Sources/Bridge/WXBridgeContext.m 
b/ios/sdk/WeexSDK/Sources/Bridge/WXBridgeContext.m
index 188fb30..1f0b5aa 100644
--- a/ios/sdk/WeexSDK/Sources/Bridge/WXBridgeContext.m
+++ b/ios/sdk/WeexSDK/Sources/Bridge/WXBridgeContext.m
@@ -368,14 +368,14 @@ _Pragma("clang diagnostic pop") \
         NSString *methodName = task[@"method"];
         NSArray *arguments = task[@"args"];
         if (task[@"component"]) {
-            [self tracingComponentTask:task instanceId:instanceId];
             NSString *ref = task[@"ref"];
             WXComponentMethod *method = [[WXComponentMethod alloc] 
initWithComponentRef:ref methodName:methodName arguments:arguments 
instance:instance];
             [method invoke];
+            [WXTracingManager startTracing:instanceId ref:task[@"ref"] 
parentRef:nil className:nil name:task[@"component"] ph:WXTracingBegin 
fName:task[@"method"] parentId:task[@"method"]];
         } else {
             NSString *moduleName = task[@"module"];
             WXModuleMethod *method = [[WXModuleMethod alloc] 
initWithModuleName:moduleName methodName:methodName arguments:arguments 
instance:instance];
-            [self tracingModuleTask:task instanceId:instanceId];
+            [WXTracingManager startTracing:instanceId ref:nil parentRef:nil 
className:nil name:task[@"module"] ph:WXTracingBegin fName:task[@"method"] 
parentId:nil];
             [method invoke];
         }
     }
@@ -385,27 +385,6 @@ _Pragma("clang diagnostic pop") \
     return 1;
 }
 
--(void)tracingComponentTask:(NSDictionary *)task instanceId:(NSString 
*)instanceId
-{
-    WXTracing *tracing = [WXTracing new];
-    tracing.iid = instanceId;
-    tracing.ref = task[@"ref"];
-    tracing.name = task[@"method"];
-    tracing.ph = WXTracingBegin;
-    tracing.fName = task[@"method"];
-    [WXTracingManager startTracing:tracing];
-}
-
--(void)tracingModuleTask:(NSDictionary *)task instanceId:(NSString *)instanceId
-{
-    WXTracing *tracing = [WXTracing new];
-    tracing.iid = instanceId;
-    tracing.name = task[@"module"];
-    tracing.ph = WXTracingBegin;
-    tracing.fName = task[@"method"];
-    [WXTracingManager startTracing:tracing];
-}
-
 - (void)createInstance:(NSString *)instance
               template:(NSString *)temp
                options:(NSDictionary *)options

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/7c3b6cfc/ios/sdk/WeexSDK/Sources/Manager/WXTracingManager.h
----------------------------------------------------------------------
diff --git a/ios/sdk/WeexSDK/Sources/Manager/WXTracingManager.h 
b/ios/sdk/WeexSDK/Sources/Manager/WXTracingManager.h
new file mode 100644
index 0000000..37e4d28
--- /dev/null
+++ b/ios/sdk/WeexSDK/Sources/Manager/WXTracingManager.h
@@ -0,0 +1,83 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+#import <Foundation/Foundation.h>
+#import "WXSDKInstance.h"
+
+#define WXTNetworkHanding          @"WXTNetworkHanding"
+#define WXTDataHanding          @"WXTDataHanding"
+#define WXTJSCall          @"jsCall"
+#define WXTRender          @"WXTRender"
+#define WXTRenderFinish          @"WXTRenderFinish"
+
+#define WXTracingBegin             @"B"
+#define WXTracingEnd               @"E"
+#define WXTracingDuration          @"D"
+#define WXTracingInstant          @"i"
+
+typedef enum : NSUInteger {
+    // global
+    WXTracingNetworkHanding = 0,
+    WXTracingDataHanding,
+    WXTracingRender
+} WXTracingTag;
+
+
+@interface WXTracingApi:NSObject
+
+@property (nonatomic, copy) NSString *name; //
+@property (nonatomic, copy) NSString *className; //
+@property (nonatomic, copy) NSString *method; //
+
+@end
+
+@interface WXTracing:NSObject
+
+@property (nonatomic, copy) NSString *ref; // compnonet id
+@property (nonatomic, copy) NSString *parentRef; // compnonet id
+@property (nonatomic, copy) NSString *className; // compnonet class name or 
module class name
+@property (nonatomic, copy) NSString *name; // register name
+@property (nonatomic, copy) NSString *ph; // phase
+@property (nonatomic) NSTimeInterval ts; // time
+@property (nonatomic) long long traceId;
+@property (nonatomic) NSTimeInterval duration;
+@property (nonatomic, copy) NSString *fName; // functionName
+@property (nonatomic, copy) NSString *iid; // instance id
+@property (nonatomic, copy) NSString *parentId;// parent event id
+-(NSDictionary *)dictionary;
+@end
+
+@interface WXTracingTask:NSObject
+
+@property (nonatomic, copy) NSString *iid;
+@property (nonatomic) long long counter;
+@property (nonatomic, copy)  NSString *tag;
+@property (nonatomic, strong) NSMutableArray *tracings;
+@property (nonatomic, copy) NSString *bundleJSType; //
+
+@end
+
+@interface WXTracingManager : NSObject
++(void)switchTracing:(BOOL)isTracing;
++(void)startTracing:(NSString *)iid ref:(NSString*)ref 
parentRef:(NSString*)parentRef className:(NSString *)className name:(NSString 
*)name ph:(NSString *)ph fName:(NSString *)fName parentId:(NSString *)parentId;
++(WXTracingTask*)getTracingData;
++(void)setBundleJSType:(NSString *)jsBundleString instanceId:(NSString *)iid;
++(NSDictionary *)getTacingApi;
+
+@end

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/7c3b6cfc/ios/sdk/WeexSDK/Sources/Manager/WXTracingManager.m
----------------------------------------------------------------------
diff --git a/ios/sdk/WeexSDK/Sources/Manager/WXTracingManager.m 
b/ios/sdk/WeexSDK/Sources/Manager/WXTracingManager.m
new file mode 100644
index 0000000..653c192
--- /dev/null
+++ b/ios/sdk/WeexSDK/Sources/Manager/WXTracingManager.m
@@ -0,0 +1,370 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+#import "WXTracingManager.h"
+#import "WXComponentFactory.h"
+#import "WXModuleFactory.h"
+#import "WXSDKManager.h"
+#import <WeexSDK/WXComponentFactory.h>
+#import <WeexSDK/WXModuleFactory.h>
+#import <WeexSDK/WXHandlerFactory.h>
+#import "WXUtility.h"
+#import "WXComponentManager.h"
+
+
+@implementation WXTracing
+
+-(NSDictionary *)dictionary {
+    return [NSDictionary 
dictionaryWithObjectsAndKeys:self.ref?:@"",@"ref",self.parentRef?:@"",@"parentRef",self.className?:@"",@"className",self.name?:@"",@"name",self.ph?:@"",@"ph",@(self.ts),@"ts",@(self.traceId),@"traceId",@(self.duration),@"duration",self.fName?:@"",@"fName",self.iid?:@"",@"iid",self.parentId?:@"",@"parentId",
 nil];
+}
+@end
+
+@implementation WXTracingTask
+
+@end
+
+@interface WXTracingManager()
+
+@property (nonatomic) BOOL isTracing;
+@property (nonatomic, strong) NSMutableDictionary *tracingTasks;  // every 
instance have a task
+@property (nonatomic, copy) NSString *currentInstanceId;  // every instance 
have a task
+
+@end
+
+@implementation WXTracingManager
+
+
++ (instancetype) sharedInstance{
+    
+    static WXTracingManager *instance = nil;
+    static dispatch_once_t once;
+    
+    dispatch_once(&once, ^{
+        instance = [[WXTracingManager alloc] initPrivate];
+    });
+    
+    return instance;
+}
+
+- (instancetype) initPrivate{
+    self = [super init];
+    if(self){
+        self.isTracing = NO;
+    }
+    
+    return self;
+}
+
++(void)switchTracing:(BOOL )isTracing
+{
+    [WXTracingManager sharedInstance].isTracing = isTracing;
+}
+
++(BOOL)isTracing
+{
+#if DEBUG
+    return [WXTracingManager sharedInstance].isTracing;
+#else
+    return NO;
+#endif
+}
+
++(void)startTracing:(WXTracing *)tracing
+{
+    if([self isTracing]){
+        if(![WXTracingManager sharedInstance].tracingTasks){
+            [WXTracingManager sharedInstance].tracingTasks = 
[NSMutableDictionary new];
+        }
+        if(![[WXTracingManager sharedInstance].tracingTasks 
objectForKey:tracing.iid]){
+            WXTracingTask *task = [WXTracingTask new];
+            task.iid = tracing.iid;
+            [[WXTracingManager sharedInstance].tracingTasks setObject:task 
forKey:tracing.iid];
+        }
+        WXTracingTask *task = [[WXTracingManager sharedInstance].tracingTasks 
objectForKey:tracing.iid];
+        if(!task.tracings){
+            task.tracings = [NSMutableArray new];
+        }
+        NSTimeInterval time=[[NSDate date] timeIntervalSince1970]*1000;
+        tracing.ts = time;
+        if(![WXTracingEnd isEqualToString:tracing.ph]){ // end is should not 
update
+            tracing.traceId = task.counter++;
+        }
+        if([WXTNetworkHanding isEqualToString:tracing.name] && [WXTracingBegin 
isEqualToString:tracing.ph]){
+            task.tag = WXTNetworkHanding;
+        }
+        NSTimeInterval ts = [[NSDate date] timeIntervalSince1970]*1000;
+        tracing.ts = ts ;
+        dispatch_async(dispatch_get_main_queue(), ^{
+            [self updateTracings:task tracing:tracing];
+        });
+    }
+}
+
++(void)setBundleJSType:(NSString *)jsBundleString instanceId:(NSString *)iid
+{
+    if([self isTracing] && iid.length >0){
+        WXTracingTask *task = [[WXTracingManager sharedInstance].tracingTasks 
objectForKey:iid];
+        if(jsBundleString.length >0){
+            NSRange range = [jsBundleString rangeOfString:@"}"];
+            if (range.location != NSNotFound) {
+                NSString *searchStr =  [jsBundleString 
substringToIndex:range.location+range.length];
+                if ([searchStr rangeOfString:@"Vue"].location != NSNotFound){
+                    task.bundleJSType = @"Vue";
+                }else if([searchStr rangeOfString:@"Rax"].location != 
NSNotFound){
+                    task.bundleJSType = @"Rax";
+                }
+            }
+        }
+    }
+}
+
++(void)startTracing:(NSString *)iid ref:(NSString*)ref 
parentRef:(NSString*)parentRef className:(NSString *)className name:(NSString 
*)name ph:(NSString *)ph fName:(NSString *)fName parentId:(NSString *)parentId
+{
+    if([self isTracing]){
+        WXTracing *tracing = [WXTracing new];
+        if(ref.length>0){
+            tracing.ref = ref;
+        }
+        if(parentRef.length>0){
+            tracing.parentRef = parentRef;
+        }
+        if(className.length>0){
+            tracing.className = className;
+        }
+        if(name.length>0){
+            tracing.name = name;
+        }
+        if(fName.length>0){
+            tracing.fName = fName;
+        }
+        if(ph.length>0){
+            tracing.ph = ph;
+        }
+        if(iid.length>0){
+            tracing.iid = iid;
+        }
+        if(parentId.length>0){
+            tracing.parentId = parentId;
+        }
+        [self startTracing:tracing];
+    }
+}
+
++(WXTracing *)copyTracing:(WXTracing *)tracing
+{
+    WXTracing *newTracing = [WXTracing new];
+    if(tracing.ref.length>0){
+        newTracing.ref = tracing.ref;
+    }
+    if(tracing.parentRef.length>0){
+        newTracing.parentRef = tracing.parentRef;
+    }
+    if(tracing.className.length>0){
+        newTracing.className = tracing.className;
+    }
+    if(tracing.name.length>0){
+        newTracing.name = tracing.name;
+    }
+    if(tracing.fName.length>0){
+        newTracing.fName = tracing.fName;
+    }
+    if(tracing.ph.length>0){
+        newTracing.ph = tracing.ph;
+    }
+    if(tracing.iid.length>0){
+        newTracing.iid = tracing.iid;
+    }
+    if(tracing.parentId.length>0){
+        newTracing.parentId = tracing.parentId;
+    }
+    if(tracing.traceId>0){
+        newTracing.traceId = tracing.traceId;
+    }
+    if(tracing.ts>0){
+        newTracing.ts = tracing.ts;
+    }
+    return newTracing;
+}
+
++(NSString *)getclassName:(WXTracing *)tracing
+{
+    NSString *className = @"";
+    if(tracing.ref.length>0 && tracing.name.length >0){
+        Class cls = [WXComponentFactory classWithComponentName:tracing.name];
+        className = NSStringFromClass(cls);
+    }else if(tracing.name.length > 0){
+        Class cls = [WXModuleFactory classWithModuleName:tracing.name];
+        if(cls){
+            className = NSStringFromClass(cls);
+        }
+    }
+    return  className;
+}
+
++(void)updateTracings:(WXTracingTask *)task tracing:(WXTracing *)tracing
+{
+    if(![WXTJSCall isEqualToString:tracing.name]){
+        tracing.className = [self getclassName:tracing];
+    }
+    if([WXTNetworkHanding isEqualToString:task.tag]){
+        if([WXTDataHanding isEqualToString:tracing.name]){
+            NSMutableArray *tracings = task.tracings;
+            [tracings enumerateObjectsWithOptions:NSEnumerationReverse 
usingBlock:^(WXTracing *bTracing, NSUInteger idx, BOOL *stop) {
+                if(([WXTNetworkHanding isEqualToString:bTracing.name] || 
[bTracing.ref isEqualToString:tracing.ref])&&[WXTracingBegin 
isEqualToString:bTracing.ph]){
+                    WXTracing *newTracing = [self copyTracing:bTracing];
+                    newTracing.iid = tracing.iid;
+                    newTracing.ph = WXTracingEnd;
+                    newTracing.ts = tracing.ts ;
+                    newTracing.duration = newTracing.ts - bTracing.ts ;
+                    bTracing.duration = newTracing.duration;
+                    [task.tracings addObject:newTracing];
+                    NSLog(@"jerry0 %f,%f",bTracing.ts,bTracing.duration);
+                    *stop = YES;
+                }
+            }];
+            task.tag = WXTDataHanding;
+        }
+    }
+    
+    if([WXTDataHanding isEqualToString:task.tag]){
+        if([WXTJSCall isEqualToString:tracing.name]){
+            NSMutableArray *tracings = task.tracings;
+            [tracings enumerateObjectsWithOptions:NSEnumerationReverse 
usingBlock:^(WXTracing *bTracing, NSUInteger idx, BOOL *stop) {
+                if(([WXTDataHanding isEqualToString:bTracing.name] || 
[bTracing.ref isEqualToString:tracing.ref])&&[WXTracingBegin 
isEqualToString:bTracing.ph]){
+                    WXTracing *newTracing = [self copyTracing:bTracing];
+                    newTracing.iid = tracing.iid;
+                    newTracing.ph = WXTracingEnd;
+                    newTracing.ts = tracing.ts ;
+                    newTracing.duration = newTracing.ts - bTracing.ts ;
+                    bTracing.duration = newTracing.duration;
+                    [task.tracings addObject:newTracing];
+                    NSLog(@"jerry1 %f,%f",bTracing.ts,bTracing.duration);
+                    *stop = YES;
+                }
+            }];
+            task.tag = WXTRender;
+        }
+    }
+    if([WXTracingEnd isEqualToString:tracing.ph]){  // deal end
+        
+        if(tracing.ref.length>0){
+            WXPerformBlockOnComponentThread(^{
+                WXSDKInstance *instance = [WXSDKManager 
instanceForID:task.iid];
+                WXComponent *com = [instance componentForRef:tracing.ref];
+                if(com.supercomponent){
+                    tracing.parentRef = com.supercomponent.ref;
+                }
+            });
+            
+        }
+        NSMutableArray *tracings = task.tracings;
+        [tracings enumerateObjectsWithOptions:NSEnumerationReverse 
usingBlock:^(WXTracing *bTracing, NSUInteger idx, BOOL *stop) {
+            if(tracing.ref.length > 0 && bTracing.ref.length>0){
+                if(![tracing.ref isEqualToString:bTracing.ref]){
+                    return ;
+                }
+            }
+            
+            if([bTracing.fName isEqualToString:tracing.fName] 
&&[WXTracingBegin isEqualToString:bTracing.ph]){
+                tracing.iid = bTracing.iid;
+                if(bTracing.ref.length > 0){
+                    tracing.ref = bTracing.ref;
+                }
+                if(tracing.parentRef.length > 0){
+                    bTracing.parentRef = tracing.parentRef;
+                }
+                tracing.duration = tracing.ts - bTracing.ts ;
+                tracing.traceId = bTracing.traceId;
+                bTracing.duration = tracing.duration;
+                *stop = YES;
+            }
+        }];
+    }
+    [task.tracings addObject:tracing];
+}
+
++(WXTracingTask *)getTracingData
+{
+    if(![self isTracing]){
+        return nil;
+    }
+    NSArray *instanceIds = [[WXSDKManager bridgeMgr] getInstanceIdStack];
+    WXTracingTask *task = [[WXTracingManager sharedInstance].tracingTasks 
objectForKey:[instanceIds firstObject]];
+    NSMutableArray *ary = [NSMutableArray new];
+    for (WXTracing *tracing in task.tracings) {
+        [ary addObject:[tracing dictionary]];
+    }
+    return task;
+}
+
++(NSDictionary *)getTacingApi
+{
+    if(![self isTracing]){
+        return @{};
+     }
+    NSMutableDictionary *dict = [NSMutableDictionary new];
+    NSMutableArray *componetArray = [NSMutableArray new];
+    NSMutableArray *moduleArray = [NSMutableArray new];
+    NSMutableArray *handleArray = [NSMutableArray new];
+    NSDictionary *componentConfigs = [WXComponentFactory componentConfigs];
+    void (^componentBlock)(id, id, BOOL *) = ^(id mKey, id mObj, BOOL * mStop) 
{
+        NSMutableDictionary *componentConfig = [mObj mutableCopy];
+        NSDictionary *cDict = [WXComponentFactory 
componentMethodMapsWithName:componentConfig[@"name"]];
+        if(cDict && [cDict count]>0 && [cDict[@"methods"] count]>0){
+            [componentConfig setObject:cDict[@"methods"] forKey:@"methods"];
+        }
+        [componetArray addObject:componentConfig];
+    };
+    [componentConfigs enumerateKeysAndObjectsUsingBlock:componentBlock];
+    if(componetArray && [componetArray count]>0){
+        [dict setObject:componetArray forKey:@"componet"];
+    }
+    NSDictionary *moduleConfigs = [WXModuleFactory moduleConfigs];
+    void (^moduleBlock)(id, id, BOOL *) = ^(id mKey, id mObj, BOOL * mStop) {
+        NSDictionary *mDict = [WXModuleFactory moduleMethodMapsWithName:mKey];
+        NSMutableDictionary *subDict = [NSMutableDictionary new];
+        [subDict setObject:mKey forKey:@"name"];
+        [subDict setObject:mObj forKey:@"class"];
+        if([mDict objectForKey:mKey]){
+            [subDict setObject:[mDict objectForKey:mKey] forKey:@"methods"];
+        }
+        [moduleArray addObject:subDict];
+    };
+    [moduleConfigs enumerateKeysAndObjectsUsingBlock:moduleBlock];
+    if(moduleArray && [moduleArray count]>0){
+        [dict setObject:moduleArray forKey:@"module"];
+    }
+    
+    
+    NSDictionary *handleConfigs = [[WXHandlerFactory handlerConfigs] 
mutableCopy];
+    void (^handleBlock)(id, id, BOOL *) = ^(id mKey, id mObj, BOOL * mStop) {
+        NSMutableDictionary *subDict = [NSMutableDictionary new];
+        [subDict setObject:mKey forKey:@"class"];
+        [subDict setObject:NSStringFromClass([mObj class]) forKey:@"name"];
+        [handleArray addObject:subDict];
+    };
+    [handleConfigs enumerateKeysAndObjectsUsingBlock:handleBlock];
+    if(handleArray && [handleArray count]>0){
+        [dict setObject:handleArray forKey:@"handle"];
+    }
+    
+    return dict;
+}
+
+@end

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/7c3b6cfc/ios/sdk/WeexSDK/Sources/Module/WXDomModule.m
----------------------------------------------------------------------
diff --git a/ios/sdk/WeexSDK/Sources/Module/WXDomModule.m 
b/ios/sdk/WeexSDK/Sources/Module/WXDomModule.m
index 5c62985..5128caa 100644
--- a/ios/sdk/WeexSDK/Sources/Module/WXDomModule.m
+++ b/ios/sdk/WeexSDK/Sources/Module/WXDomModule.m
@@ -91,15 +91,10 @@ WX_EXPORT_METHOD(@selector(getComponentRect:callback:))
 
 - (void)addElement:(NSString *)parentRef element:(NSDictionary *)element 
atIndex:(NSInteger)index
 {
-    WXTracing *tracing = [WXTracing new];
-    tracing.iid = self.weexInstance.instanceId;
-    tracing.name = @"dom";
-    tracing.ph = WXTracingEnd;
-    tracing.fName = NSStringFromSelector(_cmd);
-    [WXTracingManager startTracing:tracing];
     [self performBlockOnComponentManager:^(WXComponentManager *manager) {
         [manager addComponent:element toSupercomponent:parentRef atIndex:index 
appendingInTree:NO];
     }];
+    [WXTracingManager startTracing:self.weexInstance.instanceId ref:nil 
parentRef:nil className:nil name:@"dom" ph:WXTracingEnd fName:@"addElement" 
parentId:nil];
 }
 
 - (void)removeElement:(NSString *)ref
@@ -132,15 +127,10 @@ WX_EXPORT_METHOD(@selector(getComponentRect:callback:))
 
 - (void)createFinish
 {
-    WXTracing *tracing = [WXTracing new];
-    tracing.iid = self.weexInstance.instanceId;
-    tracing.name = @"dom";
-    tracing.ph = WXTracingEnd;
-    tracing.fName = NSStringFromSelector(_cmd);
-    [WXTracingManager startTracing:tracing];
     [self performBlockOnComponentManager:^(WXComponentManager *manager) {
         [manager createFinish];
     }];
+    [WXTracingManager startTracing:self.weexInstance.instanceId ref:nil 
parentRef:nil className:nil name:@"dom" ph:WXTracingEnd fName:@"createFinish" 
parentId:nil];
 }
 
 - (void)updateFinish

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/7c3b6cfc/ios/sdk/WeexSDK/Sources/Utility/WXTracingManager.h
----------------------------------------------------------------------
diff --git a/ios/sdk/WeexSDK/Sources/Utility/WXTracingManager.h 
b/ios/sdk/WeexSDK/Sources/Utility/WXTracingManager.h
deleted file mode 100644
index 3d18c39..0000000
--- a/ios/sdk/WeexSDK/Sources/Utility/WXTracingManager.h
+++ /dev/null
@@ -1,86 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-#import <Foundation/Foundation.h>
-#import "WXSDKInstance.h"
-
-#define WXTNetworkHanding          @"WXTNetworkHanding"
-#define WXTDataHanding          @"WXTDataHanding"
-#define WXTJSCall          @"jsCall"
-#define WXTRender          @"WXTRender"
-#define WXTRenderFinish          @"WXTRenderFinish"
-
-#define WXTracingBegin             @"B"
-#define WXTracingEnd               @"E"
-#define WXTracingDuration          @"D"
-#define WXTracingInstant          @"i"
-
-typedef enum : NSUInteger {
-    // global
-    WXTracingNetworkHanding = 0,
-    WXTracingDataHanding,
-    WXTracingRender
-} WXTracingTag;
-
-
-@interface WXTracingApi:NSObject
-
-@property (nonatomic, copy) NSString *name; //
-@property (nonatomic, copy) NSString *className; //
-@property (nonatomic, copy) NSString *method; //
-
-@end
-
-@interface WXTracing:NSObject
-
-@property (nonatomic, copy) NSString *ref; // compnonet id
-@property (nonatomic, copy) NSString *parentRef; // compnonet id
-@property (nonatomic, copy) NSString *className; // compnonet class name or 
module class name
-@property (nonatomic, copy) NSString *name; // register name
-@property (nonatomic, copy) NSString *ph; // phase
-@property (nonatomic) NSTimeInterval ts; // time
-@property (nonatomic) long long traceId;
-@property (nonatomic) NSTimeInterval duration;
-@property (nonatomic, copy) NSString *fName; // functionName
-@property (nonatomic, copy) NSString *iid; // instance id
-@property (nonatomic, copy) NSString *parentId;// parent event id
-
-@end
-
-@interface WXTracingTask:NSObject
-
-@property (nonatomic, copy) NSString *iid;
-@property (nonatomic) long long counter;
-@property (nonatomic, copy)  NSString *tag;
-@property (nonatomic, strong) NSMutableArray *tracings;
-@property (nonatomic, copy) NSString *bundleJSType; //
-
-@end
-
-@interface WXTracingManager : NSObject
-+(void)switchTracing:(BOOL)isTracing; 
-+(BOOL)isTracing;
-+(void)startTracing:(WXTracing*)tracing;
-+(void)startTracing:(NSString *)iid ref:(NSString*)ref 
parentRef:(NSString*)parentRef className:(NSString *)className name:(NSString 
*)name ph:(NSString *)ph fName:(NSString *)fName parentId:(NSString *)parentId;
-+(WXTracingTask*)getTracingData;
-+(void)setBundleJSType:(NSString *)jsBundleString instanceId:(NSString *)iid;
-+(void)getTracingData:(NSString *)instanceId;
-+(NSDictionary *)getTacingApi;
-
-@end

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/7c3b6cfc/ios/sdk/WeexSDK/Sources/Utility/WXTracingManager.m
----------------------------------------------------------------------
diff --git a/ios/sdk/WeexSDK/Sources/Utility/WXTracingManager.m 
b/ios/sdk/WeexSDK/Sources/Utility/WXTracingManager.m
deleted file mode 100644
index 2d7a29a..0000000
--- a/ios/sdk/WeexSDK/Sources/Utility/WXTracingManager.m
+++ /dev/null
@@ -1,353 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-#import "WXTracingManager.h"
-#import "WXComponentFactory.h"
-#import "WXModuleFactory.h"
-#import "WXSDKManager.h"
-#import <WeexSDK/WXComponentFactory.h>
-#import <WeexSDK/WXModuleFactory.h>
-#import <WeexSDK/WXHandlerFactory.h>
-
-
-@implementation WXTracing
-
-@end
-
-@implementation WXTracingTask
-
-@end
-
-@interface WXTracingManager()
-
-@property (nonatomic) BOOL isTracing;
-@property (nonatomic, strong) NSMutableDictionary *tracingTasks;  // every 
instance have a task
-@property (nonatomic, copy) NSString *currentInstanceId;  // every instance 
have a task
-
-@end
-
-@implementation WXTracingManager
-
-
-+ (instancetype) sharedInstance{
-    
-    static WXTracingManager *instance = nil;
-    static dispatch_once_t once;
-    
-    dispatch_once(&once, ^{
-        instance = [[WXTracingManager alloc] initPrivate];
-    });
-    
-    return instance;
-}
-
-- (instancetype) initPrivate{
-    self = [super init];
-    if(self){
-        self.isTracing = YES;
-    }
-    
-    return self;
-}
-
-+(void)switchTracing:(BOOL )isTracing
-{
-    [WXTracingManager sharedInstance].isTracing = isTracing;
-}
-
-+(BOOL)isTracing
-{
-#if DEBUG
-    return YES;
-    return [WXTracingManager sharedInstance].isTracing;
-#else
-    return NO;
-#endif
-}
-
-+(void)startTracing:(WXTracing *)tracing
-{
-    if([self isTracing]){
-        if(![WXTracingManager sharedInstance].tracingTasks){
-            [WXTracingManager sharedInstance].tracingTasks = 
[NSMutableDictionary new];
-        }
-        if(![[WXTracingManager sharedInstance].tracingTasks 
objectForKey:tracing.iid]){
-            WXTracingTask *task = [WXTracingTask new];
-            task.iid = tracing.iid;
-            [[WXTracingManager sharedInstance].tracingTasks setObject:task 
forKey:tracing.iid];
-        }
-        WXTracingTask *task = [[WXTracingManager sharedInstance].tracingTasks 
objectForKey:tracing.iid];
-        if(!task.tracings){
-            task.tracings = [NSMutableArray new];
-        }
-        NSTimeInterval time=[[NSDate date] timeIntervalSince1970]*1000;
-        tracing.ts = time;
-        if(![WXTracingEnd isEqualToString:tracing.ph]){ // end is should not 
update
-            tracing.traceId = ++task.counter;
-        }
-        if([WXTNetworkHanding isEqualToString:tracing.name] && [WXTracingBegin 
isEqualToString:tracing.ph]){
-            task.tag = WXTNetworkHanding;
-        }
-        NSTimeInterval ts = [[NSDate date] timeIntervalSince1970]*1000;
-        tracing.ts = ts ;
-        dispatch_async(dispatch_get_main_queue(), ^{
-            [self updateTracings:task tracing:tracing];
-        });
-    }
-}
-
-+(void)setBundleJSType:(NSString *)jsBundleString instanceId:(NSString *)iid
-{
-    if([self isTracing] && iid.length >0){
-        WXTracingTask *task = [[WXTracingManager sharedInstance].tracingTasks 
objectForKey:iid];
-        if(jsBundleString.length >0){
-            NSRange range = [jsBundleString rangeOfString:@"}"];
-            if (range.location != NSNotFound) {
-                NSString *searchStr =  [jsBundleString 
substringToIndex:range.location+range.length];
-                if ([searchStr rangeOfString:@"Vue"].location != NSNotFound){
-                    task.bundleJSType = @"Vue";
-                }else if([searchStr rangeOfString:@"Rax"].location != 
NSNotFound){
-                    task.bundleJSType = @"Rax";
-                }
-            }
-        }
-    }
-}
-
-+(void)startTracing:(NSString *)iid ref:(NSString*)ref 
parentRef:(NSString*)parentRef className:(NSString *)className name:(NSString 
*)name ph:(NSString *)ph fName:(NSString *)fName parentId:(NSString *)parentId
-{
-    if([self isTracing]){
-        WXTracing *tracing = [WXTracing new];
-        if(ref.length>0){
-            tracing.ref = ref;
-        }
-        if(parentRef.length>0){
-            tracing.parentRef = parentRef;
-        }
-        if(className.length>0){
-            tracing.className = className;
-        }
-        if(name.length>0){
-            tracing.name = name;
-        }
-        if(fName.length>0){
-            tracing.fName = fName;
-        }
-        if(ph.length>0){
-            tracing.ph = ph;
-        }
-        if(iid.length>0){
-            tracing.iid = iid;
-        }
-        if(parentId.length>0){
-            tracing.parentId = parentId;
-        }
-        [self startTracing:tracing];
-    }
-}
-
-+(WXTracing *)copyTracing:(WXTracing *)tracing
-{
-    WXTracing *newTracing = [WXTracing new];
-    if(tracing.ref.length>0){
-        newTracing.ref = tracing.ref;
-    }
-    if(tracing.parentRef.length>0){
-        newTracing.parentRef = tracing.parentRef;
-    }
-    if(tracing.className.length>0){
-        newTracing.className = tracing.className;
-    }
-    if(tracing.name.length>0){
-        newTracing.name = tracing.name;
-    }
-    if(tracing.fName.length>0){
-        newTracing.fName = tracing.fName;
-    }
-    if(tracing.ph.length>0){
-        newTracing.ph = tracing.ph;
-    }
-    if(tracing.iid.length>0){
-        newTracing.iid = tracing.iid;
-    }
-    if(tracing.parentId.length>0){
-        newTracing.parentId = tracing.parentId;
-    }
-    if(tracing.traceId>0){
-        newTracing.traceId = tracing.traceId;
-    }
-    if(tracing.ts>0){
-        newTracing.ts = tracing.ts;
-    }
-    return newTracing;
-}
-
-+(NSString *)getclassName:(WXTracing *)tracing
-{
-    NSString *className = @"";
-    if(tracing.ref.length>0 && tracing.name.length >0){
-        Class cls = [WXComponentFactory classWithComponentName:tracing.name];
-        className = NSStringFromClass(cls);
-    }else if(tracing.name.length > 0){
-        Class cls = [WXModuleFactory classWithModuleName:tracing.name];
-        if(cls){
-            className = NSStringFromClass(cls);
-        }
-    }
-    return  className;
-}
-
-+(void)updateTracings:(WXTracingTask *)task tracing:(WXTracing *)tracing
-{
-    if(![WXTJSCall isEqualToString:tracing.name]){
-        tracing.className = [self getclassName:tracing];
-    }
-    if([WXTNetworkHanding isEqualToString:task.tag]){
-        if([WXTDataHanding isEqualToString:tracing.name]){
-            NSMutableArray *tracings = task.tracings;
-            [tracings enumerateObjectsWithOptions:NSEnumerationReverse 
usingBlock:^(WXTracing *bTracing, NSUInteger idx, BOOL *stop) {
-                if(([WXTNetworkHanding isEqualToString:bTracing.name] || 
[bTracing.ref isEqualToString:tracing.ref])&&[WXTracingBegin 
isEqualToString:bTracing.ph]){
-                    WXTracing *newTracing = [self copyTracing:bTracing];
-                    newTracing.iid = tracing.iid;
-                    newTracing.ph = WXTracingEnd;
-                    newTracing.ts = tracing.ts ;
-                    newTracing.duration = newTracing.ts - bTracing.ts ;
-                    bTracing.duration = newTracing.duration;
-                    [task.tracings addObject:newTracing];
-                    NSLog(@"jerry0 %f,%f",bTracing.ts,bTracing.duration);
-                    *stop = YES;
-                }
-            }];
-            task.tag = WXTDataHanding;
-        }
-    }
-    
-    if([WXTDataHanding isEqualToString:task.tag]){
-        if([WXTJSCall isEqualToString:tracing.name]){
-            NSMutableArray *tracings = task.tracings;
-            [tracings enumerateObjectsWithOptions:NSEnumerationReverse 
usingBlock:^(WXTracing *bTracing, NSUInteger idx, BOOL *stop) {
-                if(([WXTDataHanding isEqualToString:bTracing.name] || 
[bTracing.ref isEqualToString:tracing.ref])&&[WXTracingBegin 
isEqualToString:bTracing.ph]){
-                    WXTracing *newTracing = [self copyTracing:bTracing];
-                    newTracing.iid = tracing.iid;
-                    newTracing.ph = WXTracingEnd;
-                    newTracing.ts = tracing.ts ;
-                    newTracing.duration = newTracing.ts - bTracing.ts ;
-                    bTracing.duration = newTracing.duration;
-                    [task.tracings addObject:newTracing];
-                    NSLog(@"jerry1 %f,%f",bTracing.ts,bTracing.duration);
-                    *stop = YES;
-                }
-            }];
-            task.tag = WXTRender;
-        }
-    }
-    if([WXTracingEnd isEqualToString:tracing.ph]){  // deal end
-        NSMutableArray *tracings = task.tracings;
-        [tracings enumerateObjectsWithOptions:NSEnumerationReverse 
usingBlock:^(WXTracing *bTracing, NSUInteger idx, BOOL *stop) {
-            if(tracing.ref.length > 0 && bTracing.ref.length>0){
-                if(![tracing.ref isEqualToString:bTracing.ref]){
-                    return ;
-                }
-            }
-            
-            if([bTracing.fName isEqualToString:tracing.fName] 
&&[WXTracingBegin isEqualToString:bTracing.ph]){
-                tracing.iid = bTracing.iid;
-                if(bTracing.ref.length > 0){
-                    tracing.ref = bTracing.ref;
-                }
-                tracing.duration = tracing.ts - bTracing.ts ;
-                tracing.traceId = bTracing.traceId;
-                bTracing.duration = tracing.duration;
-                NSLog(@"jerry2 %f,%f",bTracing.ts,bTracing.duration);
-                *stop = YES;
-            }
-        }];
-    }
-    [task.tracings addObject:tracing];
-}
-
-+(WXTracingTask *)getTracingData
-{
-    NSArray *instanceIds = [[WXSDKManager bridgeMgr] getInstanceIdStack];
-    WXTracingTask *task = [[WXTracingManager sharedInstance].tracingTasks 
objectForKey:[instanceIds firstObject]];
-    return task;
-}
-
-+(void)getTracingData:(NSString *)instanceId{
-    WXTracingTask *task = [[WXTracingManager sharedInstance].tracingTasks 
objectForKey:instanceId];
-    NSArray *tracings = [task.tracings copy];
-    for (WXTracing *tracing in tracings) {
-        if(![WXTracingBegin isEqualToString:tracing.ph]){
-//            NSLog(@"%lld %@  %@  %@  %f %f %@  
%@",tracing.traceId,tracing.fName,tracing.name,tracing.className,tracing.ts,tracing.duration,tracing.ref,tracing.parentRef);
-        }
-    }
-}
-
-+(NSDictionary *)getTacingApi
-{
-    NSMutableDictionary *dict = [NSMutableDictionary new];
-    NSMutableArray *componetArray = [NSMutableArray new];
-    NSMutableArray *moduleArray = [NSMutableArray new];
-    NSMutableArray *handleArray = [NSMutableArray new];
-    NSDictionary *componentConfigs = [WXComponentFactory componentConfigs];
-    void (^componentBlock)(id, id, BOOL *) = ^(id mKey, id mObj, BOOL * mStop) 
{
-        NSMutableDictionary *componentConfig = [mObj mutableCopy];
-        NSDictionary *cDict = [WXComponentFactory 
componentMethodMapsWithName:componentConfig[@"name"]];
-        if(cDict && [cDict count]>0 && [cDict[@"methods"] count]>0){
-            [componentConfig setObject:cDict[@"methods"] forKey:@"methods"];
-        }
-        [componetArray addObject:componentConfig];
-    };
-    [componentConfigs enumerateKeysAndObjectsUsingBlock:componentBlock];
-    if(componetArray && [componetArray count]>0){
-        [dict setObject:componetArray forKey:@"componet"];
-    }
-    NSDictionary *moduleConfigs = [WXModuleFactory moduleConfigs];
-    void (^moduleBlock)(id, id, BOOL *) = ^(id mKey, id mObj, BOOL * mStop) {
-        NSDictionary *mDict = [WXModuleFactory moduleMethodMapsWithName:mKey];
-        NSMutableDictionary *subDict = [NSMutableDictionary new];
-        [subDict setObject:mKey forKey:@"name"];
-        [subDict setObject:mObj forKey:@"class"];
-        if([mDict objectForKey:mKey]){
-            [subDict setObject:[mDict objectForKey:mKey] forKey:@"methods"];
-        }
-        [moduleArray addObject:subDict];
-    };
-    [moduleConfigs enumerateKeysAndObjectsUsingBlock:moduleBlock];
-    if(moduleArray && [moduleArray count]>0){
-        [dict setObject:moduleArray forKey:@"module"];
-    }
-    
-    
-    NSDictionary *handleConfigs = [[WXHandlerFactory handlerConfigs] 
mutableCopy];
-    void (^handleBlock)(id, id, BOOL *) = ^(id mKey, id mObj, BOOL * mStop) {
-        NSMutableDictionary *subDict = [NSMutableDictionary new];
-        [subDict setObject:mKey forKey:@"class"];
-        [subDict setObject:NSStringFromClass([mObj class]) forKey:@"name"];
-        [handleArray addObject:subDict];
-    };
-    [handleConfigs enumerateKeysAndObjectsUsingBlock:handleBlock];
-    if(handleArray && [handleArray count]>0){
-        [dict setObject:handleArray forKey:@"handle"];
-    }
-    
-    return dict;
-}
-
-@end


Reply via email to