Home

iOS 自动收起展开View组件

自动收起展开组件 前情 当我们页面中或者一个cell中有多个或一个View需要灵活展示,且我们用的是AutoLayout布局(包括Snapkit 和Masonry),我们隐藏或者展示一个View会很麻烦,如以下布局: 我们有这样一个cell布局,其中tag行中的tag Label是灵活展示的,也就是说根据服务返回各种标签判断标签是否展示,有可能只展示tag1 和 tag4, 也有可能全部展示,也有可能一个都不展示。 如果按照常规思路,比如tag2和tag3不展示,我们需要将tag2宽度设置为0, 并且需要将左边距重置为0, tag3亦是如此。 如果tag1 不展示,我们需要将其宽度设置为0, 且右边距也设置为0。多种情况都有可能存在,可想代码多复杂且非常难维护。 有没有...

Read more

gitlab CI 实现自动创建MR方案

gitlab CI 实现自动创建MR方案 一、前情介绍 如果是基于git仓库管理工具开发朋友,应该都知道基本上我们Code review 流程都是通过 create merge request进行的,gitlab MR 很开方便的提供了可视化的版本对比、以及source 分支新提交的代码自动对比、评论、@代码开发者等等功能。所以使用MR 作为Code Review是一种不错的选择。 但是基于现在组件化的开发,我们项目不再是遥远的单仓库工程,而是会拆分成大大小小的多个子仓库,壳工程则是组合这些子仓库,拼成一个完整的项目。那么每当我们有新需求迭代或者代码改动时候,我们可能会同时更改若干个库,且不说库依赖问题,即使需求遍布在多个业务库中也需要更改多个业务库。那么带来的问题也可想而知,在...

Read more

gitlab CI/CD 知识篇

Gitlab CI/CD 一、CI/CD概念 CI/CD 指的是软件开发的持续集成方法,我们可以持续构建、测试和部署软件。通过持续方法的迭代能使得我们减少在错误代码或者错误先前版本上的开发。从而也能提高开发的效率。 CI/CD 的持续集成方法主要分为三种:持续集成、持续交付、持续部署。下面我们分别介绍其在gitlab的概念。 持续集成:指的是开发人员每天多次推送代码的更改,对于每次推送到仓库,都可以创建一组脚本来构建和测试我们的应用程序。这些脚本将会减少我们在代码里引入错误的机会。 持续交付:指的是每次将代码推送到仓库,不仅会构建、测试我们的应用,并且会持续部署应用。但是对于持续交付,需要我们手动触发部署。 持续部署:是在持续交付的基础上更进一步,不同的是,持续交付需要我们...

Read more

手撕算法之排序算法

手撕算法之排序算法 排序算法应该是比较基本算法了,也是实践中比较容易用到的算法,同样也是面试中最容易问到的算法。所以对于基本的排序算法能达到提起则默写的程度是非常必要的。想想过往的面试经历中,排序算法也是经常问到并且需要手写的了。然而,扪心自问一下,除了面试前的刷题,貌似过段时间后再次提起,又是一头雾水,那么如何真正的掌握了排序算法,并且达到手撕的程度,这是一个问题?我想只有真正了解了算法的核心思想、加上不断地记忆才能真正掌握。 OK,为了达到以上两个问题,了解常见排序算法的核心思想,为了以后得不断重复记忆,特总结此文章。 排序算法我将从所谓的我认为简单易理解到困难排序解说,以及coding。 冒泡排序 (时间复杂度 最坏为 O(n^2), 最好为O(n)) 算法核心 从头...

Read more

记录一次Kingfisher使用过程中的问题

记录一次Kingfisher使用过程中问题 起因 项目在测试阶段发现一个问题,首页列表数据中可配置背景图的cell发生背景错乱。但是明明已经做了防止复用导致的错乱,如下代码 if let url = URL(string: model.imageUrl) { ownerImageView.kf.setImage(with: .network(url)) } else { ownerImageView.image = nil } if let backgroundURL = URL(string: model.backgroundImageUrl) { backgroundImageView.kf.setImage(with: .network(back...

Read more

Ruby 学习(一)

Ruby 学习(一) 前因 为什么要学习Ruby?我们都知道iOS 强大的包管理工具Cocoapods,Cocoapods正是使用Ruby进行编写,那么想要了解Cocoapods内部的实现原理,以及他架构方式,想必我们必须要学习他所使用的语言—即ruby。 初识 Ruby 背景 Ruby 这门语言呢是由日本人松本行弘 在20世纪90年代设计并开发的一种语言。那么Ruby呢,其实是一中完全面向对象的语言,在Ruby 里也是万物皆对象。当然Ruby 和 Python、JavaScript等脚本语言一样,它是一种需要解释的语言(也就是说它不需要进行编译、链接形成可执行二进制文件,而是需要一个解释器去解释执行)。据说火起来其实在2000年以后了(这个我就不知道了….) Ruby 安...

Read more

如何优化一堆的if条件语句

如何优化一堆的if条件语句 1.前提 func test() { let currentList = model for outlinesIndex in 0...currentList.outlines.count - 1 { for subOutlinesIndex in 0...currentList.outlines[outlinesIndex].subOutlines.count - 1 { if currentList.outlines[outlinesIndex].subOutlines[subOutlinesIndex].id == currentList.livingCardPac...

Read more

使用homeBrew 发布自己的Mac 软件

使用Home Brew 发布自己的Mac 软件 制作三方home brew tap 制作HomeBrew 三方tap的教程我已经在之前的文章有介绍过了,在这就不在赘述了。有需要的小伙伴可以去这里自行学习。 制作.dmg文件 打开磁盘工具 选择“文件”-“新建映像”-“空白映像” 命名为temp, 大小可以根据实际app大小给一个 完成之后会出现temp的dmg以及未命名的一个磁盘 准备三个材料:1、打好的.app包 2、app包的icon 3、应用程序的替身 1/2 就不用多介绍了 应用程序的替身制作...

Read more

Flutter 入门简介

Flutter 入门简介 1 简介 Flutter 是由谷歌开发推出的一款开源的移动应用开发框架,其主打的就是跨平台、高保真、高性能。其开发呢主要使用的dart语言。一套代码可以同时在Android和iOS 系统上运行。并且Flutter 还可以和原生进行混合开发。 2 主要优势 2.1跨平台自绘渲染引擎 Flutter 采用自绘渲染引擎Skia,那么和其他的跨平台框架不同的是,其他框架要不采用webView进行渲染,要不采用操作原生控件进行渲染, 并且避免了像RN,weex那样不断和native进行布局同步,导致的布局卡顿,手势卡顿等问题。那么Flutter利用自己的跨平台2d绘制渲染引擎,不仅可以保证UI的一致性,而且能降低维护的成本。(Skia是安卓系统一直使用的一个...

Read more

FLEX在iOS15 以上设备的OOM排查

起因 从iOS 15 开始我们发现FLEX 三方库在我们的iOS 工程无法使用,表现为ExploreToolBar可以正常显示,但是只要点击ToolBar上任何按钮都会发生内存占用暴增,导致内存崩溃(即OOM),这个问题虽然发现的很早,但是原因和方案一直没有去探索。导致其实有的时候我们遇到想要Debug的一些功能只能用iOS 15以下的一些设备去排查。甚至都想关掉FLEX。另外FLEX提供的DEBUG功能确实是非常的丰富,对于我们开发来说也是帮助很大,所以我觉得还是有必要排查清楚为什么会导致OOM,又该怎么去解决。(当然近期我也在github Flex 进行的反馈,至今没有接收到回复…) 排查 排查发生崩溃的原因(OOM) 其实最早之前我并不知道,是因为OOM崩溃的,直到开始探...

Read more

MGJRouterKit 实现、优劣浅析

代码浅析 存 通过MGJRouter 单例管理。并且缓存在NSMutableDictionay *routes, 那么我们来看一下,他具体缓存的数据结构是什么样子的? 例如 aa://bb/cc/dd 关键代码为: + (void)registerURLPattern:(NSString *)URLPattern toHandler:(MGJRouterHandler)handler { [[self sharedInstance] addURLPattern:URLPattern andHandler:handler]; } - (void)addURLPattern:(NSString *)URLPattern andHandler:(MGJRouterHand...

Read more

基于home brew的iOS Codelint 安装工具(lintmaker)

lintmaker 简介 lintmaker 是使用swift 开发的一个CLI工具。主要负责了iOS 工程swift、objc语言的lint工具集成。 使用lintmaker 可以傻瓜式一键安装、生效,在git 项目中,每次git commit 就会验证其代码规范性。 主要功能 下载规则配置文件以及hook script、缓存到Library/Caches/ && 移动到当前目录(或者指定目录)下 安装lint 依赖工具,home brew tap update, Objective-Clint, swiftlint、python3等工具 清理空间目录,即删除配置文件以及hook script 卸载安装, 清除空间目录 &&...

Read more

home brew 的研究

前言 虽然已经对homeBrew 如何去指定自己的taps 、如何写Formula脚本、以及安装更新自己的软件,有了一定的了解和使用,但是终归感觉不了解整体homeBrew的架构、机制。 因此,需要对home brew 做一个深入的研究。 正文 home brew 简介 如果你是一名MacOs的使用者,那么我相信你肯定知道 home brew,也可能已经对于home brew 普通的一些命令非常熟悉了。那么home brew是什么? 引用brew 官方文档的一句介绍的话:The Missing Package Manager for macOS (or Linux), Homebrew Cask installs macOS apps, fonts and plugins ...

Read more

shell 杂记(不断更新...)

终端输出奇技淫巧 1. \u{1B}[1A\u{1B}[K 这是一种 ANSI 转义序列,通常用于控制终端的光标位置和清除屏幕上的文本。”\u{1B}[1A” 表示将光标向上移动一行,”\u{1B}[K” 表示清除当前光标位置后面的文本。组合在一起,这个序列的意思是将光标移动到当前行的开头并清除该行的文本。 Pod cache http://blog.fpliu.com/it/os/macOS/software/CocoaPods/pod-cache shell 杂记 1. shell 语句中的while 循环语句 while test 条件 do # 循环体代码 done while test $count -gt 0; do echo "" done while...

Read more

基于homebrew 的code lint 集成

基于homebrew 的code lint 集成(总) 前情 之前文章中我们已经讲到了采用pre-commit 集成工具去集成code lint 工具(Objective-CLint、swiftlint),文章地址,这种方式当然很方便,但是也很难扩展。比如swiftLint 我们就没有很好的办法让其以html或者其他的方式打开,只能显示到控制台,再比如我们后续想要整合oc和swift lint的结果。也没有好的办法实现。那么我们就要另辟西路。 当然我们还是采用pre-commit 的时期,只是我们不在采用pre-commit工具集成,我们自己写pre-commit脚本、自己做工具的安装等等时期。 这样我们的可扩展行很强,我们想干什么都可以,只要我们能想的到的… 开发/架构 ...

Read more