Переглянути джерело

修复多线程刷新数据偶现的崩溃问题

Steven 3 місяців тому
батько
коміт
f5acf7a246
26 змінених файлів з 598 додано та 506 видалено
  1. 107 39
      KulexiuForStudent/KulexiuForStudent/Module/TXClassRoom/View/VideoList/TXClassroomVideoListView.m
  2. 1 0
      KulexiuForStudent/Pods/Headers/Private/KSToolsLibrary/KSIndexPathValidator.h
  3. 1 0
      KulexiuForStudent/Pods/Headers/Public/KSToolsLibrary/KSIndexPathValidator.h
  4. 467 445
      KulexiuForStudent/Pods/Pods.xcodeproj/project.pbxproj
  5. 1 1
      KulexiuForStudent/Pods/Pods.xcodeproj/xcuserdata/wangzhi.xcuserdatad/xcschemes/AFNetworking.xcscheme
  6. 1 1
      KulexiuForStudent/Pods/Pods.xcodeproj/xcuserdata/wangzhi.xcuserdatad/xcschemes/Bugly.xcscheme
  7. 1 1
      KulexiuForStudent/Pods/Pods.xcodeproj/xcuserdata/wangzhi.xcuserdatad/xcschemes/CHIPageControl.xcscheme
  8. 1 1
      KulexiuForStudent/Pods/Pods.xcodeproj/xcuserdata/wangzhi.xcuserdatad/xcschemes/IQKeyboardManager.xcscheme
  9. 1 1
      KulexiuForStudent/Pods/Pods.xcodeproj/xcuserdata/wangzhi.xcuserdatad/xcschemes/JCore.xcscheme
  10. 1 1
      KulexiuForStudent/Pods/Pods.xcodeproj/xcuserdata/wangzhi.xcuserdatad/xcschemes/JPush.xcscheme
  11. 1 1
      KulexiuForStudent/Pods/Pods.xcodeproj/xcuserdata/wangzhi.xcuserdatad/xcschemes/JXCategoryView.xcscheme
  12. 1 1
      KulexiuForStudent/Pods/Pods.xcodeproj/xcuserdata/wangzhi.xcuserdatad/xcschemes/JXPagingView.xcscheme
  13. 1 1
      KulexiuForStudent/Pods/Pods.xcodeproj/xcuserdata/wangzhi.xcuserdatad/xcschemes/MBProgressHUD.xcscheme
  14. 1 1
      KulexiuForStudent/Pods/Pods.xcodeproj/xcuserdata/wangzhi.xcuserdatad/xcschemes/MJExtension.xcscheme
  15. 1 1
      KulexiuForStudent/Pods/Pods.xcodeproj/xcuserdata/wangzhi.xcuserdatad/xcschemes/MJRefresh.xcscheme
  16. 1 1
      KulexiuForStudent/Pods/Pods.xcodeproj/xcuserdata/wangzhi.xcuserdatad/xcschemes/Masonry.xcscheme
  17. 1 1
      KulexiuForStudent/Pods/Pods.xcodeproj/xcuserdata/wangzhi.xcuserdatad/xcschemes/Pods-KulexiuForStudent-KulexiuForStudentUITests.xcscheme
  18. 1 1
      KulexiuForStudent/Pods/Pods.xcodeproj/xcuserdata/wangzhi.xcuserdatad/xcschemes/Pods-KulexiuForStudent.xcscheme
  19. 1 1
      KulexiuForStudent/Pods/Pods.xcodeproj/xcuserdata/wangzhi.xcuserdatad/xcschemes/Pods-KulexiuForStudentTests.xcscheme
  20. 1 1
      KulexiuForStudent/Pods/Pods.xcodeproj/xcuserdata/wangzhi.xcuserdatad/xcschemes/RSKImageCropper.xcscheme
  21. 1 1
      KulexiuForStudent/Pods/Pods.xcodeproj/xcuserdata/wangzhi.xcuserdatad/xcschemes/Reachability.xcscheme
  22. 1 1
      KulexiuForStudent/Pods/Pods.xcodeproj/xcuserdata/wangzhi.xcuserdatad/xcschemes/SDWebImage.xcscheme
  23. 1 1
      KulexiuForStudent/Pods/Pods.xcodeproj/xcuserdata/wangzhi.xcuserdatad/xcschemes/SSZipArchive.xcscheme
  24. 1 1
      KulexiuForStudent/Pods/Pods.xcodeproj/xcuserdata/wangzhi.xcuserdatad/xcschemes/SocketRocket.xcscheme
  25. 1 1
      KulexiuForStudent/Pods/Pods.xcodeproj/xcuserdata/wangzhi.xcuserdatad/xcschemes/Whiteboard-Whiteboard.xcscheme
  26. 1 1
      KulexiuForStudent/Pods/Pods.xcodeproj/xcuserdata/wangzhi.xcuserdatad/xcschemes/Whiteboard.xcscheme

+ 107 - 39
KulexiuForStudent/KulexiuForStudent/Module/TXClassRoom/View/VideoList/TXClassroomVideoListView.m

@@ -9,6 +9,7 @@
 #import "TXClassroomVideoListView.h"
 #import "TXClassroomVideoListCell.h"
 #import "ClassroomService.h"
+#import "KSIndexPathValidator.h"
 
 @interface TXClassroomVideoListView ()<UITableViewDelegate,UITableViewDataSource>
 
@@ -43,10 +44,15 @@
 }
 
 - (void)getDataSource {
+    __weak typeof(self) weakSelf = self;
     dispatch_async(self.videoListQueue, ^{
-        MJ_LOCK(self.signalSemaphore);
+        __strong typeof(weakSelf) strongSelf = weakSelf;
+        if (!strongSelf) return;
+
+        MJ_LOCK(self.signalSemaphore)
         NSArray *tempArray = [ClassroomService sharedService].currentRoom.memberList;
         if (tempArray.count <= 0) {
+            MJ_UNLOCK(strongSelf.signalSemaphore)
             return;
         }
         NSSortDescriptor * des = [[NSSortDescriptor alloc] initWithKey:@"joinTime" ascending:YES];
@@ -93,80 +99,142 @@
         
         // 移除掉主屏显示成员
         NSString *display = [ClassroomService sharedService].currentRoom.currentDisplayURI;
-        for (RoomMember *member in lastArray) {
+        NSMutableIndexSet *removeIndexes = [[NSMutableIndexSet alloc] init];
+        [lastArray enumerateObjectsUsingBlock:^(RoomMember *member, NSUInteger idx, BOOL *stop) {
             if ([member.userId isEqualToString:display] && [ClassroomService sharedService].currentRoom.currentDisplayType != DisplayWhiteboard) {
-                [lastArray removeObject:member];
-                break;
+                [removeIndexes addIndex:idx];
+                *stop = YES;
             }
-        }
+        }];
+        [lastArray removeObjectsAtIndexes:removeIndexes];
+        NSArray *safeData = [lastArray copy]; // 创建不可变副本
         
         dispatch_async(dispatch_get_main_queue(), ^{
-            self.videoDataSource = [lastArray mutableCopy];
-            [self.videoListTableView reloadData];
+            __strong typeof(weakSelf) strongSelf = weakSelf;
+            if (!strongSelf || !strongSelf.videoListTableView) {
+                MJ_UNLOCK(strongSelf.signalSemaphore)
+                return;
+            }
+            
+            strongSelf.videoDataSource = [safeData mutableCopy];
+            [strongSelf.videoListTableView reloadData];
+            MJ_UNLOCK(strongSelf.signalSemaphore)
         });
-        MJ_UNLOCK(self.signalSemaphore)
     });
 }
 
 - (void)updateUserVideo:(NSString *)userId {
+    __weak typeof(self) weakSelf = self;
+
     dispatch_async(self.videoListQueue, ^{
+        __strong typeof(weakSelf) strongSelf = weakSelf;
+        if (!strongSelf) return;
+        
         MJ_LOCK(self.signalSemaphore)
-        NSLog(@"------ unlock---");
-        for(int i=0;i < self.videoDataSource.count; i++) {
-            RoomMember *member = self.videoDataSource[i];
-            if([member.userId isEqualToString:userId]) {
-                NSIndexPath *index = [NSIndexPath indexPathForRow:i inSection:0];
-                dispatch_async(dispatch_get_main_queue(), ^{
-                    TXClassroomVideoListCell * cell = [self.videoListTableView cellForRowAtIndexPath:index];
-                    if (cell) {
-                        [self.videoListTableView reloadRowsAtIndexPaths:@[index] withRowAnimation:UITableViewRowAnimationNone];
-                    }
-                });
+        NSArray *safeDataSource = [strongSelf.videoDataSource copy];
+        NSMutableArray *indexPaths = [[NSMutableArray alloc] init];
+
+        [safeDataSource enumerateObjectsUsingBlock:^(RoomMember *member, NSUInteger idx, BOOL *stop) {
+            if ([member.userId isEqualToString:userId]) {
+                [indexPaths addObject:[NSIndexPath indexPathForRow:idx inSection:0]];
             }
+        }];
+        
+        if (indexPaths.count == 0) {
+            MJ_UNLOCK(strongSelf.signalSemaphore)
+            return;
         }
-        MJ_UNLOCK(self.signalSemaphore)
+        
+        dispatch_async(dispatch_get_main_queue(), ^{
+            __strong typeof(weakSelf) strongSelf = weakSelf;
+            if (!strongSelf) {
+                MJ_UNLOCK(strongSelf.signalSemaphore)
+                return;
+            }
+            NSArray *validIPs = [[KSIndexPathValidator validatorWithType:KSScrollViewTypeTableView] validateForTableView:self.videoListTableView indexPaths:indexPaths];
+            if (validIPs.count) {
+                [strongSelf.videoListTableView performBatchUpdates:^{
+                    [strongSelf.videoListTableView reloadRowsAtIndexPaths:indexPaths
+                                                      withRowAnimation:UITableViewRowAnimationNone];
+                } completion:^(BOOL finished) {
+                    MJ_UNLOCK(strongSelf.signalSemaphore)
+                }];
+            }
+            else {
+                MJ_UNLOCK(strongSelf.signalSemaphore)
+            }
+        });
     });
 }
 
 - (void)updateUserQuality:(NSString *)userId netWorkingStatus:(TXNetWorkingStatus)quality {
+    __weak typeof(self) weakSelf = self;
     dispatch_async(self.videoListQueue, ^{
-        MJ_LOCK(self.signalQualitySemaphore)
-        NSLog(@"------ unlock---");
-        for(int i = 0;i < self.videoDataSource.count; i++) {
-            RoomMember *member = self.videoDataSource[i];
-            if([member.userId isEqualToString:userId]) {
-                NSIndexPath *index = [NSIndexPath indexPathForRow:i inSection:0];
+        
+        __strong typeof(weakSelf) strongSelf = weakSelf;
+        if (!strongSelf) return;
+        
+        MJ_LOCK(strongSelf.signalQualitySemaphore)
+        
+        NSArray *safeDataSource = [strongSelf.videoDataSource copy];
+        
+        [safeDataSource enumerateObjectsUsingBlock:^(RoomMember *member, NSUInteger idx, BOOL *stop) {
+            if ([member.userId isEqualToString:userId]) {
+                RoomMember *currentMember = [[ClassroomService sharedService].currentRoom getMember:userId];
+                NSIndexPath *index = [NSIndexPath indexPathForRow:idx inSection:0];
+                
                 dispatch_async(dispatch_get_main_queue(), ^{
-                    TXClassroomVideoListCell * cell = [self.videoListTableView cellForRowAtIndexPath:index];
+                    __strong typeof(weakSelf) strongSelf = weakSelf;
+                    if (!strongSelf) {
+                        MJ_UNLOCK(strongSelf.signalQualitySemaphore)
+                        return;
+                    }
+                    
+                    TXClassroomVideoListCell * cell = [strongSelf.videoListTableView cellForRowAtIndexPath:index];
                     if (cell) {
                         [cell updateQuality:quality];
                     }
+                    MJ_UNLOCK(strongSelf.signalQualitySemaphore)
                 });
+                return;
             }
-        }
-        MJ_UNLOCK(self.signalQualitySemaphore)
+        }];
+        
+        MJ_UNLOCK(strongSelf.signalQualitySemaphore)
     });
 }
 
 - (void)updateMicStatus:(NSString *)userId volume:(NSInteger)volume {
+    __weak typeof(self) weakSelf = self;
     dispatch_async(self.videoListQueue, ^{
-        MJ_LOCK(self.signalVolumeSemaphore)
-        NSLog(@"------ unlock---");
-        for(int i = 0;i < self.videoDataSource.count; i++) {
-            RoomMember *member = self.videoDataSource[i];
-            if([member.userId isEqualToString:userId]) {
+        __strong typeof(weakSelf) strongSelf = weakSelf;
+        if (!strongSelf) return;
+        
+        MJ_LOCK(strongSelf.signalVolumeSemaphore)
+        NSArray *safeDataSource = [strongSelf.videoDataSource copy];
+        
+        [safeDataSource enumerateObjectsUsingBlock:^(RoomMember *member, NSUInteger idx, BOOL *stop) {
+            if ([member.userId isEqualToString:userId]) {
                 RoomMember *currentMember = [[ClassroomService sharedService].currentRoom getMember:userId];
-
-                NSIndexPath *index = [NSIndexPath indexPathForRow:i inSection:0];
+                NSIndexPath *index = [NSIndexPath indexPathForRow:idx inSection:0];
+                
                 dispatch_async(dispatch_get_main_queue(), ^{
-                    TXClassroomVideoListCell * cell = [self.videoListTableView cellForRowAtIndexPath:index];
+                    __strong typeof(weakSelf) strongSelf = weakSelf;
+                    if (!strongSelf) {
+                        MJ_UNLOCK(strongSelf.signalVolumeSemaphore)
+                        return;
+                    }
+                    
+                    TXClassroomVideoListCell *cell = [strongSelf.videoListTableView cellForRowAtIndexPath:index];
                     if (cell) {
                         [cell updateUserVolume:volume isCloseMic:!currentMember.microphoneEnable];
                     }
+                    MJ_UNLOCK(strongSelf.signalVolumeSemaphore)
                 });
+                return;
             }
-        }
-        MJ_UNLOCK(self.signalVolumeSemaphore)
+        }];
+        MJ_UNLOCK(strongSelf.signalVolumeSemaphore)
     });
 }
 

+ 1 - 0
KulexiuForStudent/Pods/Headers/Private/KSToolsLibrary/KSIndexPathValidator.h

@@ -0,0 +1 @@
+../../../../../../../WorkSpace/TargetModule/my-local-repo/KSToolsLibrary/KSToolsLibrary/Classes/TableView/KSIndexPathValidator.h

+ 1 - 0
KulexiuForStudent/Pods/Headers/Public/KSToolsLibrary/KSIndexPathValidator.h

@@ -0,0 +1 @@
+../../../../../../../WorkSpace/TargetModule/my-local-repo/KSToolsLibrary/KSToolsLibrary/Classes/TableView/KSIndexPathValidator.h

Різницю між файлами не показано, бо вона завелика
+ 467 - 445
KulexiuForStudent/Pods/Pods.xcodeproj/project.pbxproj


+ 1 - 1
KulexiuForStudent/Pods/Pods.xcodeproj/xcuserdata/wangzhi.xcuserdatad/xcschemes/AFNetworking.xcscheme

@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <Scheme
-   LastUpgradeVersion = "1620"
+   LastUpgradeVersion = "1600"
    version = "1.3">
    <BuildAction
       parallelizeBuildables = "YES"

+ 1 - 1
KulexiuForStudent/Pods/Pods.xcodeproj/xcuserdata/wangzhi.xcuserdatad/xcschemes/Bugly.xcscheme

@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <Scheme
-   LastUpgradeVersion = "1620"
+   LastUpgradeVersion = "1600"
    version = "1.3">
    <BuildAction
       parallelizeBuildables = "YES"

+ 1 - 1
KulexiuForStudent/Pods/Pods.xcodeproj/xcuserdata/wangzhi.xcuserdatad/xcschemes/CHIPageControl.xcscheme

@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <Scheme
-   LastUpgradeVersion = "1620"
+   LastUpgradeVersion = "1600"
    version = "1.3">
    <BuildAction
       parallelizeBuildables = "YES"

+ 1 - 1
KulexiuForStudent/Pods/Pods.xcodeproj/xcuserdata/wangzhi.xcuserdatad/xcschemes/IQKeyboardManager.xcscheme

@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <Scheme
-   LastUpgradeVersion = "1620"
+   LastUpgradeVersion = "1600"
    version = "1.3">
    <BuildAction
       parallelizeBuildables = "YES"

+ 1 - 1
KulexiuForStudent/Pods/Pods.xcodeproj/xcuserdata/wangzhi.xcuserdatad/xcschemes/JCore.xcscheme

@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <Scheme
-   LastUpgradeVersion = "1620"
+   LastUpgradeVersion = "1600"
    version = "1.3">
    <BuildAction
       parallelizeBuildables = "YES"

+ 1 - 1
KulexiuForStudent/Pods/Pods.xcodeproj/xcuserdata/wangzhi.xcuserdatad/xcschemes/JPush.xcscheme

@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <Scheme
-   LastUpgradeVersion = "1620"
+   LastUpgradeVersion = "1600"
    version = "1.3">
    <BuildAction
       parallelizeBuildables = "YES"

+ 1 - 1
KulexiuForStudent/Pods/Pods.xcodeproj/xcuserdata/wangzhi.xcuserdatad/xcschemes/JXCategoryView.xcscheme

@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <Scheme
-   LastUpgradeVersion = "1620"
+   LastUpgradeVersion = "1600"
    version = "1.3">
    <BuildAction
       parallelizeBuildables = "YES"

+ 1 - 1
KulexiuForStudent/Pods/Pods.xcodeproj/xcuserdata/wangzhi.xcuserdatad/xcschemes/JXPagingView.xcscheme

@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <Scheme
-   LastUpgradeVersion = "1620"
+   LastUpgradeVersion = "1600"
    version = "1.3">
    <BuildAction
       parallelizeBuildables = "YES"

+ 1 - 1
KulexiuForStudent/Pods/Pods.xcodeproj/xcuserdata/wangzhi.xcuserdatad/xcschemes/MBProgressHUD.xcscheme

@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <Scheme
-   LastUpgradeVersion = "1620"
+   LastUpgradeVersion = "1600"
    version = "1.3">
    <BuildAction
       parallelizeBuildables = "YES"

+ 1 - 1
KulexiuForStudent/Pods/Pods.xcodeproj/xcuserdata/wangzhi.xcuserdatad/xcschemes/MJExtension.xcscheme

@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <Scheme
-   LastUpgradeVersion = "1620"
+   LastUpgradeVersion = "1600"
    version = "1.3">
    <BuildAction
       parallelizeBuildables = "YES"

+ 1 - 1
KulexiuForStudent/Pods/Pods.xcodeproj/xcuserdata/wangzhi.xcuserdatad/xcschemes/MJRefresh.xcscheme

@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <Scheme
-   LastUpgradeVersion = "1620"
+   LastUpgradeVersion = "1600"
    version = "1.3">
    <BuildAction
       parallelizeBuildables = "YES"

+ 1 - 1
KulexiuForStudent/Pods/Pods.xcodeproj/xcuserdata/wangzhi.xcuserdatad/xcschemes/Masonry.xcscheme

@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <Scheme
-   LastUpgradeVersion = "1620"
+   LastUpgradeVersion = "1600"
    version = "1.3">
    <BuildAction
       parallelizeBuildables = "YES"

+ 1 - 1
KulexiuForStudent/Pods/Pods.xcodeproj/xcuserdata/wangzhi.xcuserdatad/xcschemes/Pods-KulexiuForStudent-KulexiuForStudentUITests.xcscheme

@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <Scheme
-   LastUpgradeVersion = "1620"
+   LastUpgradeVersion = "1600"
    version = "1.3">
    <BuildAction
       parallelizeBuildables = "YES"

+ 1 - 1
KulexiuForStudent/Pods/Pods.xcodeproj/xcuserdata/wangzhi.xcuserdatad/xcschemes/Pods-KulexiuForStudent.xcscheme

@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <Scheme
-   LastUpgradeVersion = "1620"
+   LastUpgradeVersion = "1600"
    version = "1.3">
    <BuildAction
       parallelizeBuildables = "YES"

+ 1 - 1
KulexiuForStudent/Pods/Pods.xcodeproj/xcuserdata/wangzhi.xcuserdatad/xcschemes/Pods-KulexiuForStudentTests.xcscheme

@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <Scheme
-   LastUpgradeVersion = "1620"
+   LastUpgradeVersion = "1600"
    version = "1.3">
    <BuildAction
       parallelizeBuildables = "YES"

+ 1 - 1
KulexiuForStudent/Pods/Pods.xcodeproj/xcuserdata/wangzhi.xcuserdatad/xcschemes/RSKImageCropper.xcscheme

@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <Scheme
-   LastUpgradeVersion = "1620"
+   LastUpgradeVersion = "1600"
    version = "1.3">
    <BuildAction
       parallelizeBuildables = "YES"

+ 1 - 1
KulexiuForStudent/Pods/Pods.xcodeproj/xcuserdata/wangzhi.xcuserdatad/xcschemes/Reachability.xcscheme

@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <Scheme
-   LastUpgradeVersion = "1620"
+   LastUpgradeVersion = "1600"
    version = "1.3">
    <BuildAction
       parallelizeBuildables = "YES"

+ 1 - 1
KulexiuForStudent/Pods/Pods.xcodeproj/xcuserdata/wangzhi.xcuserdatad/xcschemes/SDWebImage.xcscheme

@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <Scheme
-   LastUpgradeVersion = "1620"
+   LastUpgradeVersion = "1600"
    version = "1.3">
    <BuildAction
       parallelizeBuildables = "YES"

+ 1 - 1
KulexiuForStudent/Pods/Pods.xcodeproj/xcuserdata/wangzhi.xcuserdatad/xcschemes/SSZipArchive.xcscheme

@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <Scheme
-   LastUpgradeVersion = "1620"
+   LastUpgradeVersion = "1600"
    version = "1.3">
    <BuildAction
       parallelizeBuildables = "YES"

+ 1 - 1
KulexiuForStudent/Pods/Pods.xcodeproj/xcuserdata/wangzhi.xcuserdatad/xcschemes/SocketRocket.xcscheme

@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <Scheme
-   LastUpgradeVersion = "1620"
+   LastUpgradeVersion = "1600"
    version = "1.3">
    <BuildAction
       parallelizeBuildables = "YES"

+ 1 - 1
KulexiuForStudent/Pods/Pods.xcodeproj/xcuserdata/wangzhi.xcuserdatad/xcschemes/Whiteboard-Whiteboard.xcscheme

@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <Scheme
-   LastUpgradeVersion = "1620"
+   LastUpgradeVersion = "1600"
    version = "1.3">
    <BuildAction
       parallelizeBuildables = "YES"

+ 1 - 1
KulexiuForStudent/Pods/Pods.xcodeproj/xcuserdata/wangzhi.xcuserdatad/xcschemes/Whiteboard.xcscheme

@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <Scheme
-   LastUpgradeVersion = "1620"
+   LastUpgradeVersion = "1600"
    version = "1.3">
    <BuildAction
       parallelizeBuildables = "YES"

Деякі файли не було показано, через те що забагато файлів було змінено