Skip to content

Latest commit

 

History

History
676 lines (547 loc) · 30.7 KB

说明.md

File metadata and controls

676 lines (547 loc) · 30.7 KB

RxStudy

RxSwift/RxCocoa框架的学习

更新2021年5月25日

这个项目建立的时间我查看了一下git的提交记录,2019年1月29日。

过了2年了才重新开始RxSwift的学习,我不得不说对我而言Rx还是很难,可能是我没有理解。

跑去学了Flutter和简单的Vue入门,说实话Vue的学习成本是最低的,因为它的MVVM框架基本上已经好了,你不需要做太多的操作,开箱即用。

Flutter的学习曲线稍微难一点,但是学会了Provider之后,基本也算是在MVVM上路。

反观Rx的学习曲线真的是陡峭啊,虽然我理解Oberveral其实就是异步的stream,但是使用起来的时候还是一脸懵逼,因为它不过智能简单,需要理解大量非原生的API。

如果你要说为啥不直接上Combine,我只是想说Rx学了,Combine还会难么?

SwiftUI+Combine联合起来才能展现威力,不过在苹果这一侧,一个好的响应式和状态管理都还不够好,虽然Rx有些框架已经在向大前端的实现了,可惜的时候原生的支持不够好的,学习成本也太高了。

这个可能是我第一个Swift的MVVM项目,依旧撸的玩安卓的api。

我已经写了Flutter和uni-app版本,所以Swift版本更看重的逻辑与RxSwift的理解。

曾经的我更看重在单个UI上的编写与实现,现在经常想的是这个有没有现成的轮子可以,更偏向于思路与思考。我不是说UI不需要思考,如果有好用的轮子何乐而不为呢?

能用OC桥接过来的库,必然有它的独特性与通用性,MJRefresh与MB、SV真香。

更新2021年7月28日

MBProgressHUD全部替换为SVProgressHUD。

黑暗模式适配完成。

Flutter版wanandroid客户端

项目地址

uni-app版wanandroid客户端

项目地址

Xcode新版的代码块

代码块

最近的出现的bug

[TableView] Warning once only: UITableView was told to layout its visible cells and other contents without being in the view hierarchy (the table view or one of its superviews has not been added to a window). This may cause bugs by forcing views inside the table view to load and perform layout without accurate information (e.g. table view bounds, trait collection, layout margins, safe area insets, etc), and will also cause unnecessary performance overhead due to extra layout passes. Make a symbolic breakpoint at UITableViewAlertForLayoutOutsideViewHierarchy to catch this in the debugger and see what caused this to occur, so you can avoid this action altogether if possible, or defer it until the table view has been added to a window. Table view: <UITableView: 0x14c864c00; frame = (-207 -368; 414 736); clipsToBounds = YES; gestureRecognizers = <NSArray: 0x28028cea0>; layer = <CALayer: 0x280cdf420>; contentOffset: {0, 0}; contentSize: {414, 0}; adjustedContentInset: {0, 0, 44, 0}; dataSource: <RxCocoa.RxTableViewDataSourceProxy: 0x2828e4060>>

我在Stack Overflow看了一下,大概意思就是我没有在主线程进行页面布局

Stack Overflow

然后我把BaseTableViewController => viewDidLoad => setupTableView => 简单布局

DispatchQueue.main.async {
    
}

我这个包裹就可以,我实在没明白为什么

Release模式下编译错误

2021年10月13日,经常尝试跑Release模式,直接报错了,目前还没有时间考虑这个问题。

remark: Incremental compilation has been disabled: it is not compatible with whole module optimization
Command CompileSwiftSources failed with a nonzero exit code

已经解决:

链接在下方: https://stackoverflow.com/questions/52387452/command-compileswift-failed-with-a-nonzero-exit-code-in-xcode-10

使用的方案是下面这种:

我搜索了在pod中使用了CommonCrypto的框架,发现是Kingfisher,然后我先注释掉了Kingfisher,进行pod install操作,然后在进行pod install --repo-update就好了。

Optimize Object Lifetimes

在看了这篇文章之后,我开启了Xcode13中有关Swift中生命周期优化的配置。

Xcode13对Swift对象生命周期的优化

在Xcode13中新建一个.js文件,找不到

我新建了一个appStore.js文件,但是R函数编译,或者使用原生的Boundle.main.url的方法都没有找到它。

后来我就在想,是不是工程根本没有添加进来。

然后我在TARGETS → Build Phases→Copy Boundle Resources列表中果然没有。

最后自己手动添加后,才正常。

准备使用路由工具的,后来看了一下就没有使用

我本来打算在这个项目里面使用第三方路由工具的,然后我跑去看了一下我整个项目中使用push和pop方法的次数。

push 7次

pop 2次

对于一个逻辑跳转简单的工程,使用复杂的路由工具反而不合时宜,于是就放弃了。

打算通过KVO来监听系统切换Light或者Dark模式,然后想试试RxSwift的版本

class Person: NSObject {
    var name: String = ""
    var height: CGFloat = 1.80
    var address: String = ""
}

普通版本

var model = Person()
var observer: NSKeyValueObservation?

observer = model.observe(\Person.name, options: [.old, .new]) { (model, change) in
  if let old = change.oldValue {
    print(old)
  }
  if let new = change.newValue {
    print(new) 
  }
}

// 修改model的值
model.name = "season"

最后别忘了删除观察者

model.removeObserver(self, forKeyPath: "name")

Rx版本:

let p1 = Person()
p1.name = "flion"
p1.height = 190
p1.address = "china"
p1.rx.observe(String.self, "address").subscribe(onNext: { value in
    print("new address is \(value)")
}).disposed(by: disposeBag)

p1.address = "usa"

使用rx.observe同样存在着原生KVO所面临的问题,即rx.observe只能作用于NSObject子类的class类型,而不能作用于struct和enum。所以为了能更通用一点,再继续看下面的方法吧。

struct Person {
    var name: String = ""
    var height: CGFloat = 180
    var address: String = "" {
        didSet {
            addressSubject.onNext(address)
        }
    }
    var addressSubject = PublishSubject<String>()
}

let p2 = Person()
p2.name = "flion"
p2.height = 190
p2.address = "china"
p2.addressSubject.asObservable().subscribe(onNext: { value in
    print("new address is \(value)")
}).dispose(by: disposeBag)

p2.address = "usa"

Relay基本同理,详细见这篇文章:

https://www.jianshu.com/p/5b402cd97330

一个GitHub上面的功能尝试

Github Actions 免费构建 iOS 包

RxSwift6.5出现的bug

在更新到RxSwift6.5后,发现WebViewController的收藏状态有异常,

明明isContainsRelay我优化成为PublishRelay类型,并且只做了一次isContainsRelay.accept操作,但是subscribe却走了两次,而且没有收藏,第二次的值确实true.

我回滚到RxSwift5.1版本,发现是好的,我觉得是RxSwift向上升级,导致的bug

isContainsRelay.subscribe { [weak self] event in
	switch event {

	case .next(let value):
		self?.collectionButton.isSelected = value
	default:
		break
	}
}.disposed(by: rx.disposeBag)

最后发现,是这个页面的viewModel.output.collectRelay与vm.outputs.unCollectRelay中这两个relay使用是BehaviorRelay类型.

结果就进行了默认值绑定,出了异常,奇怪的是RxSwift5.0是好的,但是RxSwift6.5是有问题的.

只能认为,5.0的时候先默认,然后在用进行是否登录的判断处理,而6.5是先进行是否登录的判断处理,再默认,结果最后绑定的是默认值

R.swift升级文档

https://github.com/mac-cain13/R.swift/blob/master/Documentation/Migration.md

Swift-DocC

  • 这里设置为Yes

Snip20220909_32

  • 进行编译

  • Help打开

  • 进行导出

    image-20220909120210982

关于setupUI与binding

按照我后面对于工程的写法,一般情况下会将页面布局写在setupUI中,而viewModel对于数据对UI的绑定写在binding中,目前对于整个RxStudy工程正在进行代码的CodeReview,已完成绝大部分符合要求的思路。

关于SwiftLint

文档:https://github.com/realm/SwiftLint/blob/main/README_CN.md

使用的是Homebrew全局使用的SwiftLint,如果需要通过Cocopods安装SwiftLint,请根据官方文档进行集成,如果不想管理这里,直接删除Build Phase中的SwiftLint Run Script。

关于PrivacyInfo.xcprivacy

update_privacy_info.py:一个自动化脚本用于生成与检查PrivacyInfo.xcprivacy

missing-api-declaration-for-accessing-userdefaults-timestamps-other-apis

通过使用根目录下的update_privacy_info.py可以进行排查与生成。

RxStudy git:(develop) ✗ python3 update_privacy_info.py /Users/season/Documents/Swift\ Git/RxStudy

关于periphery

periphery

这个库主要是用于检查无用代码的,我的安装方式是通过Homebrew进行全局安装。

然后在项目根目录执行,进行配置即可,配置完成后会生成一个.periphery.yml文件,其实和SwiftLint很类似。

periphery scan --setup  

通过pod集成如何操作我目前还不会太,全局配置扫描出来的结果还算不错。

后面就直接使用

periphery scan

关于APPAnalyzeCommand

APPAnalyze

这个工具是用于分析包体积的,是一个终端命令行工具

我已经把RxStudy某个版本的Debug做了一次分析。这里记录一下这个工具的使用过程:

1.使用XCode打包Archive,然后一顿操作输出RxStudy.ipa文件

2.将RxStudy.ipa文件改后缀RxStudy.zip,解压,获取一个RxStudy.app的应用

3.将RxStudy.app与APPAnalyzeCommand放在同一个文件夹下面,这里是我是放在一个叫APP文件夹下面。由于APPAnalyzeCommand是一个shell运行程序,很有可能没有权限,可以做这样一个操作:

sudo chmod -R 777 /Users/dy/Movies/APP

这样就对这个文件夹放开权限了,可以进行脚本运行了

注意给任何文件夹加权都是 sudo chmod -R 777 文件夹名

4.运行以下脚本

/Users/dy/Movies/APP/APPAnalyzeCommand --ipa /Users/dy/Movies/APP/RxStudy.app --output /Users/dy/Movies/APP

大概得解析如下:

MainCommand.swift-59:执行参数:["/Users/dy/Movies/APP/APPAnalyzeCommand", "--ipa", "/Users/dy/Movies/APP/RxStudy.app", "--output", "/Users/dy/Movies/APP"]
otool环境地址:/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/otool
size环境地址:/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/size
assetutil环境地址:/usr/bin/assetutil
RxStudy:解析资源
MarqueeLabel:解析资源
RxSwiftExt:解析资源
RswiftResources:解析资源
CombineCocoa:解析资源
SSZipArchive:解析资源
Moya:解析资源
Kingfisher:解析资源
KeychainAccess:解析资源
AcknowList:解析资源
RxRelay:解析资源
MJRefresh:解析资源
SVProgressHUD:解析资源
SFSafeSymbols:解析资源
RxGesture:解析资源
CocoaLumberjack:解析资源
LifetimeTracker:解析资源
RxTheme:解析资源
FBRetainCycleDetector:解析资源
IQKeyboardManagerSwift:解析资源
MBProgressHUD:解析资源
DZNEmptyDataSet:解析资源
SnapKit:解析资源
Alamofire:解析资源
JXSegmentedView:解析资源
RxOptional:解析资源
NSObject_Rx:解析资源
CombineExt:解析资源
KSCrash:解析资源
RxCocoa:解析资源
RxDataSources:解析资源
FSPagerView:解析资源
RxSwift:解析资源
SwiftDate:解析资源
RxViewController:解析资源
Differentiator:解析资源
RxBlocking:解析资源
RxSwiftExt:解析 __DATA Objective-C Segment
RxSwiftExt:解析 __TEXT Section
RxSwiftExt:解析 __TEXT __cstring
RswiftResources:解析 __DATA Objective-C Segment
Moya:解析 __DATA Objective-C Segment
RswiftResources:解析 __TEXT Section
CombineCocoa:解析 __DATA Objective-C Segment
KeychainAccess:解析 __DATA Objective-C Segment
CombineCocoa:解析 __TEXT Section
RswiftResources:解析 __TEXT __cstring
Moya:解析 __TEXT Section
KeychainAccess:解析 __TEXT Section
Moya:解析 __TEXT __cstring
CombineCocoa:解析 __TEXT __cstring
SSZipArchive:解析 __DATA Objective-C Segment
KeychainAccess:解析 __TEXT __cstring
SSZipArchive:解析 __TEXT Section
RxRelay:解析 __DATA Objective-C Segment
RxRelay:解析 __TEXT Section
RxRelay:解析 __TEXT __cstring
SFSafeSymbols:解析 __DATA Objective-C Segment
MarqueeLabel:解析 __DATA Objective-C Segment
RxGesture:解析 __DATA Objective-C Segment
SSZipArchive:解析 __TEXT __cstring
RxGesture:解析 __TEXT Section
RxGesture:解析 __TEXT __cstring
RxTheme:解析 __DATA Objective-C Segment
RxTheme:解析 __TEXT Section
RxTheme:解析 __TEXT __cstring
Kingfisher:解析 __DATA Objective-C Segment
FBRetainCycleDetector:解析 __DATA Objective-C Segment
Kingfisher:解析 __TEXT Section
Kingfisher:解析 __TEXT __cstring
MBProgressHUD:解析 __DATA Objective-C Segment
FBRetainCycleDetector:解析 __TEXT Section
SFSafeSymbols:解析 __TEXT Section
SFSafeSymbols:解析 __TEXT __cstring
MarqueeLabel:解析 __TEXT Section
CocoaLumberjack:解析 __DATA Objective-C Segment
FBRetainCycleDetector:解析 __TEXT __cstring
MarqueeLabel:解析 __TEXT __cstring
IQKeyboardManagerSwift:解析 __DATA Objective-C Segment
IQKeyboardManagerSwift:解析 __TEXT Section
IQKeyboardManagerSwift:解析 __TEXT __cstring
DZNEmptyDataSet:解析 __DATA Objective-C Segment
DZNEmptyDataSet:解析 __TEXT Section
DZNEmptyDataSet:解析 __TEXT __cstring
Alamofire:解析 __DATA Objective-C Segment
MBProgressHUD:解析 __TEXT Section
MBProgressHUD:解析 __TEXT __cstring
SnapKit:解析 __DATA Objective-C Segment
SnapKit:解析 __TEXT Section
SnapKit:解析 __TEXT __cstring
NSObject_Rx:解析 __DATA Objective-C Segment
NSObject_Rx:解析 __TEXT Section
NSObject_Rx:解析 __TEXT __cstring
CombineExt:解析 __DATA Objective-C Segment
CombineExt:解析 __TEXT Section
CombineExt:解析 __TEXT __cstring
RxOptional:解析 __DATA Objective-C Segment
RxOptional:解析 __TEXT Section
RxOptional:解析 __TEXT __cstring
JXSegmentedView:解析 __DATA Objective-C Segment
RxCocoa:解析 __DATA Objective-C Segment
RxCocoa:解析 __TEXT Section
CocoaLumberjack:解析 __TEXT Section
RxCocoa:解析 __TEXT __cstring
Alamofire:解析 __TEXT Section
JXSegmentedView:解析 __TEXT Section
CocoaLumberjack:解析 __TEXT __cstring
Alamofire:解析 __TEXT __cstring
JXSegmentedView:解析 __TEXT __cstring
FSPagerView:解析 __DATA Objective-C Segment
FSPagerView:解析 __TEXT Section
RxSwift:解析 __DATA Objective-C Segment
RxDataSources:解析 __DATA Objective-C Segment
FSPagerView:解析 __TEXT __cstring
RxDataSources:解析 __TEXT Section
SwiftDate:解析 __DATA Objective-C Segment
KSCrash:解析 __DATA Objective-C Segment
KSCrash:解析 __TEXT Section
KSCrash:解析 __TEXT __cstring
RxSwift:解析 __TEXT Section
SwiftDate:解析 __TEXT Section
Differentiator:解析 __DATA Objective-C Segment
SwiftDate:解析 __TEXT __cstring
RxViewController:解析 __DATA Objective-C Segment
RxViewController:解析 __TEXT Section
RxSwift:解析 __TEXT __cstring
RxDataSources:解析 __TEXT __cstring
RxViewController:解析 __TEXT __cstring
RxBlocking:解析 __DATA Objective-C Segment
RxBlocking:解析 __TEXT Section
SVProgressHUD:解析 __DATA Objective-C Segment
SVProgressHUD:解析 __TEXT Section
RxBlocking:解析 __TEXT __cstring
SVProgressHUD:解析 __TEXT __cstring
Differentiator:解析 __TEXT Section
Differentiator:解析 __TEXT __cstring
LifetimeTracker:解析 __DATA Objective-C Segment
LifetimeTracker:解析 __TEXT Section
LifetimeTracker:解析 __TEXT __cstring
MJRefresh:解析 __DATA Objective-C Segment
MJRefresh:解析 __TEXT Section
MJRefresh:解析 __TEXT __cstring
AcknowList:解析 __DATA Objective-C Segment
AcknowList:解析 __TEXT Section
AcknowList:解析 __TEXT __cstring
RxStudy:解析 __DATA Objective-C Segment
RxStudy:解析 __TEXT Section
RxStudy:解析 __TEXT __cstring
LoadObjCClassRule:开始检查
UnusedCategoryMethodsRule:开始检查
DynamicUseObjCClassRule:开始检查
DuplicateCategoryMethodsRule:开始检查
UnusedClassRule:开始检查
UnusedObjCMethodRule:开始检查
DuplicateResourceRule:开始检查
UnusedImagesetRule:开始检查
DuplicateCategoryMethodsRule.swift-38:未找到类-UICollectionView
DuplicateCategoryMethodsRule.swift-38:未找到类-UIScrollView
DuplicateCategoryMethodsRule.swift-38:未找到类-UITableView
DuplicateCategoryMethodsRule.swift-38:未找到类-NSData
DuplicateCategoryMethodsRule.swift-38:未找到类-NSString
DuplicateCategoryMethodsRule.swift-38:未找到类-UIImageView
DuplicateCategoryMethodsRule.swift-38:未找到类-UIScrollView
DuplicateCategoryMethodsRule.swift-38:未找到类-UIView
DuplicateCategoryMethodsRule.swift-38:未找到类-UIViewController
DuplicateCategoryMethodsRule.swift-38:未找到类-UIImage
DuplicateCategoryMethodsRule.swift-38:未找到类-UIScrollView
DuplicateCategoryMethodsRule.swift-38:未找到类-UIView
DuplicateResourceRule:结束检查-耗时0s
UnusedResourceRule:开始检查
LoadObjCClassRule:结束检查-耗时0s
LargeResourceRule:开始检查
DuplicateCategoryMethodsRule.swift-38:未找到类-RxCocoa.RxCollectionViewDataSourcePrefetchingProxy
DuplicateCategoryMethodsRule.swift-38:未找到类-RxCocoa.RxCollectionViewDataSourceProxy
DuplicateCategoryMethodsRule.swift-38:未找到类-RxCocoa.RxCollectionViewDelegateProxy
DuplicateCategoryMethodsRule.swift-38:未找到类-RxCocoa.RxTableViewDelegateProxy
DuplicateCategoryMethodsRule.swift-38:未找到类-RxCocoa.RxNavigationControllerDelegateProxy
DuplicateCategoryMethodsRule.swift-38:未找到类-RxCocoa.RxPickerViewDataSourceProxy
DuplicateCategoryMethodsRule.swift-38:未找到类-RxCocoa.RxPickerViewDelegateProxy
DuplicateCategoryMethodsRule.swift-38:未找到类-RxCocoa.RxScrollViewDelegateProxy
DuplicateCategoryMethodsRule.swift-38:未找到类-RxCocoa.RxSearchBarDelegateProxy
DuplicateCategoryMethodsRule.swift-38:未找到类-RxCocoa.RxSearchControllerDelegateProxy
DuplicateCategoryMethodsRule.swift-38:未找到类-RxCocoa.RxTabBarControllerDelegateProxy
DuplicateCategoryMethodsRule.swift-38:未找到类-RxCocoa.RxTabBarDelegateProxy
DuplicateCategoryMethodsRule.swift-38:未找到类-RxCocoa.RxTableViewDataSourcePrefetchingProxy
DuplicateCategoryMethodsRule.swift-38:未找到类-RxCocoa.RxTableViewDataSourceProxy
DuplicateCategoryMethodsRule.swift-38:未找到类-RxCocoa.RxTextStorageDelegateProxy
DuplicateCategoryMethodsRule.swift-38:未找到类-RxCocoa.RxTextViewDelegateProxy
DuplicateCategoryMethodsRule.swift-38:未找到类-RxCocoa.RxWKNavigationDelegateProxy
DuplicateCategoryMethodsRule.swift-38:未找到类-UILabel
DuplicateCategoryMethodsRule.swift-38:未找到类-NSBundle
DuplicateCategoryMethodsRule.swift-38:未找到类-UICollectionViewLayout
DuplicateCategoryMethodsRule.swift-38:未找到类-UIScrollView
DuplicateCategoryMethodsRule.swift-38:未找到类-UIScrollView
DuplicateCategoryMethodsRule.swift-38:未找到类-UIView
DuplicateCategoryMethodsRule.swift-38:未找到类-NSDictionary
DuplicateCategoryMethodsRule.swift-38:未找到类-NSArray
DuplicateCategoryMethodsRule.swift-38:未找到类-NSString
DuplicateCategoryMethodsRule.swift-38:未找到类-NSData
DuplicateCategoryMethodsRule.swift-38:未找到类-NSError
DuplicateCategoryMethodsRule.swift-38:未找到类-NSMutableData
DuplicateCategoryMethodsRule:结束检查-耗时0s
DynamicFrameworkRule:开始检查
LargeResourceRule:结束检查-耗时0s
DuplicateObjCClassRule:开始检查
DuplicateObjCClassRule:结束检查-耗时0s
ConflictCategoryMethodsRule:开始检查
DynamicUseObjCClassRule:结束检查-耗时0s
UnusedObjCProtocolRule:开始检查
ConflictCategoryMethodsRule:结束检查-耗时0s
IncorrectObjCPropertyDefineRule:开始检查
UnusedObjCProtocolRule:结束检查-耗时0s
UnimplementedObjCProtocolMethodRule:开始检查
UnimplementedObjCProtocolMethodRule:结束检查-耗时0s
BundleMutipleScaleImageRule:开始检查
BundleMutipleScaleImageRule:结束检查-耗时0s
UnusedObjCPropertyRule:开始检查
IncorrectObjCPropertyDefineRule:结束检查-耗时0s
LargeSymbolRule:开始检查
UnusedClassRule:结束检查-耗时0s
UnusedCategoryMethodsRule.swift-94:未找到类-NSData
LargeSymbolRule:结束检查-耗时0s
UnusedCategoryMethodsRule.swift-94:未找到类-UIScrollView
UnusedCategoryMethodsRule.swift-94:未找到类-UIView
UnusedCategoryMethodsRule.swift-94:未找到类-UIViewController
UnusedCategoryMethodsRule.swift-94:未找到类-UIImage
UnusedCategoryMethodsRule.swift-94:未找到类-UIScrollView
UnusedObjCPropertyRule:结束检查-耗时0s
UnusedResourceRule:结束检查-耗时0s
UnusedObjCMethodRule.swift-193:SSZipArchive_NSCoding-协议不存在
UnusedCategoryMethodsRule.swift-94:未找到类-UIScrollView
UnusedCategoryMethodsRule.swift-94:未找到类-UIScrollView
UnusedCategoryMethodsRule.swift-94:未找到类-UIView
UnusedObjCMethodRule.swift-193:MarqueeLabel.MarqueeLabel_NSCoding-协议不存在
UnusedCategoryMethodsRule.swift-94:未找到类-NSDictionary
UnusedCategoryMethodsRule.swift-94:未找到类-NSArray
UnusedCategoryMethodsRule:结束检查-耗时0s
UnusedImagesetRule:结束检查-耗时0s
UnusedObjCMethodRule.swift-193:KFSessionDelegate_NSCoding-协议不存在
UnusedObjCMethodRule.swift-193:Kingfisher.AnimatedImageView_NSCoding-协议不存在
UnusedObjCMethodRule.swift-193:MBProgressHUD_NSCoding-协议不存在
UnusedObjCMethodRule.swift-193:MBRoundProgressView_NSCoding-协议不存在
UnusedObjCMethodRule.swift-193:FBRetainCycleDetector_NSCoding-协议不存在
UnusedObjCMethodRule.swift-193:FBBlockStrongRelationDetector_NSCoding-协议不存在
UnusedObjCMethodRule.swift-193:FBAssociationManager_NSCoding-协议不存在
UnusedObjCMethodRule.swift-193:DDDispatchQueueLogFormatter_NSCoding-协议不存在
UnusedObjCMethodRule.swift-193:DDLogFileInfo_NSCoding-协议不存在
UnusedObjCMethodRule.swift-193:DDOSLogger_NSCoding-协议不存在
UnusedObjCMethodRule.swift-193:DDAtomicCounter_NSCoding-协议不存在
UnusedObjCMethodRule.swift-193:DDFileLogger_NSCoding-协议不存在
UnusedObjCMethodRule.swift-193:DDASLLogCapture_NSCoding-协议不存在
UnusedObjCMethodRule.swift-193:DDContextDenylistFilterLogFormatter_NSCoding-协议不存在
UnusedObjCMethodRule.swift-193:DDContextAllowlistFilterLogFormatter_NSCoding-协议不存在
UnusedObjCMethodRule.swift-193:DDLog_NSCoding-协议不存在
UnusedObjCMethodRule.swift-193:DDAbstractDatabaseLogger_NSCoding-协议不存在
UnusedObjCMethodRule.swift-193:DDBufferedProxy_NSCoding-协议不存在
UnusedObjCMethodRule.swift-193:DDLogFileManagerDefault_NSCoding-协议不存在
UnusedObjCMethodRule.swift-193:DDTTYLogger_NSCoding-协议不存在
UnusedObjCMethodRule.swift-193:DDMultiFormatter_NSCoding-协议不存在
UnusedObjCMethodRule.swift-193:IQKeyboardManagerSwift.IQKeyboardManager_NSCoding-协议不存在
UnusedObjCMethodRule.swift-193:IQKeyboardManagerSwift.IQTitleBarButtonItem_NSCoding-协议不存在
UnusedObjCMethodRule.swift-193:IQKeyboardManagerSwift.IQBarButtonItem_NSCoding-协议不存在
UnusedObjCMethodRule.swift-193:IQKeyboardManagerSwift.IQInvocation_NSCoding-协议不存在
UnusedObjCMethodRule.swift-193:IQKeyboardManagerSwift.IQBarButtonItemConfiguration_NSCoding-协议不存在
UnusedObjCMethodRule.swift-193:IQKeyboardManagerSwift.IQKeyboardReturnKeyHandler_NSCoding-协议不存在
UnusedObjCMethodRule.swift-193:DZNEmptyDataSetView_NSCoding-协议不存在
UnusedObjCMethodRule.swift-193:JXSegmentedView.JXSegmentedListContainerView_NSCoding-协议不存在
UnusedObjCMethodRule.swift-193:JXSegmentedView.JXSegmentedIndicatorGradientView_NSCoding-协议不存在
UnusedObjCMethodRule.swift-193:JXSegmentedView.JXSegmentedView_NSCoding-协议不存在
UnusedObjCMethodRule.swift-193:JXSegmentedView.JXSegmentedComponetGradientView_NSCoding-协议不存在
UnusedObjCMethodRule.swift-193:JXSegmentedView.JXSegmentedIndicatorTriangleView_NSCoding-协议不存在
UnusedObjCMethodRule.swift-193:FSPagerView.FSPagerViewTransformer_NSCoding-协议不存在
UnusedObjCMethodRule.swift-193:FSPagerView.FSPagerView_NSCoding-协议不存在
UnusedObjCMethodRule.swift-193:FSPagerView.FSPagerViewLayout_NSCoding-协议不存在
UnusedObjCMethodRule.swift-193:FSPagerView.FSPageControl_NSCoding-协议不存在
UnusedObjCMethodRule.swift-193:SVRadialGradientLayer_NSCoding-协议不存在
UnusedObjCMethodRule.swift-193:SVProgressHUD_NSCoding-协议不存在
UnusedObjCMethodRule.swift-193:LifetimeTracker.LifetimeTrackerDashboardIntegration_NSCoding-协议不存在
UnusedObjCMethodRule.swift-193:LifetimeTracker.DashboardTableViewController_NSCoding-协议不存在
UnusedObjCMethodRule.swift-193:LifetimeTracker.LifetimeTracker_NSCoding-协议不存在
UnusedObjCMethodRule.swift-193:LifetimeTracker.CircularDashboardViewController_NSCoding-协议不存在
UnusedObjCMethodRule.swift-193:LifetimeTracker.LifetimeConfiguration_NSCoding-协议不存在
UnusedObjCMethodRule.swift-193:LifetimeTracker.LifetimeTrackerListViewController_NSCoding-协议不存在
UnusedObjCMethodRule.swift-193:LifetimeTracker.BarDashboardViewController_NSCoding-协议不存在
UnusedObjCMethodRule.swift-193:MJRefreshComponent_NSCoding-协议不存在
UnusedObjCMethodRule.swift-193:MJRefreshTrailer_NSCoding-协议不存在
UnusedObjCMethodRule.swift-193:MJRefreshGifHeader_NSCoding-协议不存在
UnusedObjCMethodRule.swift-193:MJRefreshStateHeader_NSCoding-协议不存在
UnusedObjCMethodRule.swift-193:MJRefreshHeader_NSCoding-协议不存在
UnusedObjCMethodRule.swift-193:MJRefreshFooter_NSCoding-协议不存在
UnusedObjCMethodRule.swift-193:MJRefreshAutoGifFooter_NSCoding-协议不存在
UnusedObjCMethodRule.swift-193:MJRefreshBackGifFooter_NSCoding-协议不存在
UnusedObjCMethodRule.swift-193:KSCrashAlertViewProcess_NSCoding-协议不存在
UnusedObjCMethodRule.swift-193:KSCrashReportFilterConcatenate_NSCoding-协议不存在
UnusedObjCMethodRule.swift-193:KSCrashReportFilterObjectForKey_NSCoding-协议不存在
UnusedObjCMethodRule.swift-193:KSCrash_NSCoding-协议不存在
UnusedObjCMethodRule.swift-193:KSCrashMailProcess_NSCoding-协议不存在
UnusedObjCMethodRule.swift-193:KSCrashFilterSets_NSCoding-协议不存在
UnusedObjCMethodRule.swift-193:KSCrashInstallation_NSCoding-协议不存在
UnusedObjCMethodRule.swift-193:KSCString_NSCoding-协议不存在
UnusedObjCMethodRule.swift-193:KSReachabilityKSCrash_NSCoding-协议不存在
UnusedObjCMethodRule.swift-193:KSCrashReportFilterSubset_NSCoding-协议不存在
UnusedObjCMethodRule.swift-193:KSHTTPMultipartPostBody_NSCoding-协议不存在
UnusedObjCMethodRule.swift-193:KSCrashReportFilterPipeline_NSCoding-协议不存在
UnusedObjCMethodRule.swift-193:KSCrashReportFilterCombine_NSCoding-协议不存在
UnusedObjCMethodRule.swift-193:AcknowList.AcknowListViewController_NSCoding-协议不存在
UnusedObjCMethodRule.swift-193:Alamofire.SessionDelegate_NSCoding-协议不存在
UnusedObjCMethodRule.swift-193:RxStudy.CustomLogFileManager_NSCoding-协议不存在
UnusedObjCMethodRule.swift-193:RxStudy.MessageContentCell_NSCoding-协议不存在
UnusedObjCMethodRule.swift-193:RxStudy.LogoutCell_NSCoding-协议不存在
UnusedObjCMethodRule.swift-193:RxStudy.CustomImageView_NSCoding-协议不存在
UnusedObjCMethodRule.swift-193:RxStudy.GrayView_NSCoding-协议不存在
UnusedObjCMethodRule.swift-193:RxStudy.WeakScriptMessageDelegate_NSCoding-协议不存在
UnusedObjCMethodRule.swift-193:RxStudy.Transform_NSCoding-协议不存在
UnusedObjCMethodRule.swift-193:RxStudy.AppDelegate_NSCoding-协议不存在
UnusedObjCMethodRule.swift-193:RxStudy.InfoCell_NSCoding-协议不存在
UnusedObjCMethodRule.swift-193:RxStudy.Target_NSCoding-协议不存在
UnusedObjCMethodRule.swift-193:RxStudy.InfoViewCell_NSCoding-协议不存在
UnusedObjCMethodRule.swift-193:RxStudy.Teacher_NSCoding-协议不存在
UnusedObjCMethodRule.swift-193:RxStudy.WeakProxy_NSCoding-协议不存在
UnusedObjCMethodRule.swift-193:RxStudy.CustomLogFormatter_NSCoding-协议不存在
UnusedObjCMethodRule.swift-193:RxStudy.EditTableViewController_NSCoding-协议不存在
UnusedObjCMethodRule.swift-193:RxStudy.BaseTableViewCell_NSCoding-协议不存在
UnusedObjCMethodRule.swift-193:RxStudy.BaseViewController_NSCoding-协议不存在
UnusedObjCMethodRule.swift-193:RxStudy.SafariActivity_NSCoding-协议不存在
UnusedObjCMethodRule.swift-193:RxStudy.MessageCell_NSCoding-协议不存在
UnusedObjCMethodRule.swift-193:RxStudy.BaseNavigationController_NSCoding-协议不存在
UnusedObjCMethodRule.swift-193:RxStudy.SnapKitLayoutAnimationController_NSCoding-协议不存在
UnusedObjCMethodRule.swift-193:RxStudy.ContentScrollView_NSCoding-协议不存在
UnusedObjCMethodRule.swift-193:RxStudy.NetworkActivityLogger_NSCoding-协议不存在
UnusedObjCMethodRule.swift-193:CrashController_NSCoding-协议不存在
UnusedObjCMethodRule.swift-193:RxStudy.ViewController_NSCoding-协议不存在
UnusedObjCMethodRule.swift-193:RxStudy.CopyActivity_NSCoding-协议不存在
UnusedObjCMethodRule.swift-193:RxStudy.MyView_NSCoding-协议不存在
UnusedObjCMethodRule:结束检查-耗时0s
DynamicFrameworkRule:结束检查-耗时0s
MainCommand.swift-89:结束执行
总耗时6s

就可以获得App包的信息了,可以有针对性的进行优化了。

考虑到Git的提交,这里就没有将.app与APPAnalyzeCommand同步上来。

关于Cocoapods-sled

cocoapods-sled

我在develop_binary分支使用了一个Cocoapods-sled插件,这个插件干嘛呢,就是把第三方库给二进制化,引入的不再是源码,而是.frameworl包,至于为啥使用.frameworl包,其实我也是看的大佬的文章知道的,大概就是这个目的:

随着业务的扩展、项目体积的增大,CocoaPods组件库越来越多,每次重新编译的时候速度越来越慢,这给我们提出了需要提高编译速度的需求。

为了提高项目编译速度,对于大量使用组件化开发的项目组而言,组件二进制化是必然要走的路线。

文章地址:https://juejin.cn/post/6844904202813046797?searchId=2024110810065103D5CBB265420B0D738B

别说啥,就是卷。

写Cocoapods-sled其实思路就是.framework的缓存路径,另外就是在pod install时候通过扩展的方法进行切片,其实我对Ruby不太了解,有空看看源码