成都网站建设设计

将想法与焦点和您一起共享

ios开发文章,ios开发文档

iOS开发-需要了解的Shell脚本语法

Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁。Shell 既是一种命令语言,又是一种程序设计语言。Shell 脚本(shell script),是一种为 shell 编写的脚本程序。在iOS开发中,我们通常编写一些自动化的脚本文件,来提高我们的生产效率,其本质就是通过Shell脚本对一些 xcodebuild , xcode-select , xcpretty , xcrun 等指令的封装。本篇文章,我们就针对 Shell 脚本的语法,做一些罗列,以辅助我们去完成一些自动化封装。

成都创新互联主要从事成都网站设计、网站建设、外贸网站建设、网页设计、企业做网站、公司建网站等业务。立足成都服务可克达拉,10年网站建设经验,价格优惠、服务专业,欢迎来电咨询建站服务:028-86922220

执行脚本

.sh 文件为 Shell 脚本文件格式,通过 sh 指令执行脚本文件

执行结果:

1.通过 echo 输出变量时,需要使用 $ 或者 ${} 修饰

2. (重点)定义变量时,等号之间不能有空格,不然会误认为变量为一个指令

3.可以直接修改 name 变量的值,即当前 name 默认为 readwrite 权限

4.我们给 _var 用 readonly 修饰后,再修改值会抛出异常

执行结果:

执行结果:

执行结果:

执行结果:

$@ 和 $* 都是输出所有参数,前者是 "$1" "$2" "$3" "$4" ,后者是 "$1 $2 $3 $4"

执行结果:

注意:条件表达式要放在方括号之间,并且要有空格,例如: [$a==$b] 是错误的,必须写成 [ $a == $b ] 。

关于文件检测运算符,这里还是都罗列一下吧,比较重要:

执行结果:

执行结果:

执行结果:

执行结果:

2.有参数

执行结果:

注意: $10 不能获取第十个参数,获取第十个参数需要 ${10} .

使用 man 查询 指令文档

比如我们想查看 xcodebuild 指令下都有哪些操作,直接在终端执行:

当我们不清楚某一个指令下的操作时,就可以通过 man 查询,然后辅助我们来编写 Shell 指令。

在iOS下,了解下这些 Shell 语法就足够了,已经可以帮助我们完成大部分的 Shell脚本 的编写或者阅读别人的 Shell 源码。不需要记忆,简单看下就可以。

Cocoapods,让iOS开发更简单(三):实践经验汇总

相信各位读了之前的两篇文章,对pods的使用已经相当熟练了。不过在纷繁复杂的实际使用场景下,可能还是会遇到一些问题。本文就结合自己的实践经验,做一些快问快答,希望大家能多多补充交流。话不多说,那我们就即刻开始吧!

pod系列文章

Cocoapods,让iOS开发更简单(一):走近Cocoapods

Cocoapods,让iOS开发更简单(二):创建私有库

Cocoapods,让iOS开发更简单(三):实践经验汇总

一文带你快速分清静态库-动态库-Framework

一般推荐使用指定版本或范围版本号,以确保依赖的稳定性。

总结 :能用pod install解决问题的,就不要用pod update。因为pod update会把依赖库全部检查一遍,不仅慢有时候还会出现坑。

忽略Pods警告,有些第三方Pod集成进来会有一大堆警告信息,在Podfile中对应的target或分组下加上关键字inhibit_all_warnings!就可以把警告忽略。

作用:

在pods中用frameworks替代.a静态库。

场景:

swift项目pods默认开启(use_frameworks!),OC项目pods默认关闭(#use_frameworks!),同时需满足以下两点,

解析:

swift工程依赖了OC工程的话,需要use_modular_headers!

示例:

为某个 Pods 使用模块化标头,可以使用以下语法:

pod 'TestPodLib', :modular_headers = true

另外,当全局使用 use_modular_headers! 属性时,同时还可以使用以下方法从模块化标头中排除特定的Pod:

pod 'TestPodLib', :modular_headers = false

版本格式:主版本号.次版本号.修订号,版本号递增规则如下:

常用的方式调用pod中的素材是不生效的,因为默认是从mainBundle中读取的,如

打在pod中的素材已经不在mainBundle中而在对应组件下的bundle 里面,所以应该这么调用:

在用CocoaPods集成第三方库之后,默认情况下,使用类似#import XXX/YYY.h的方式引入第三方库的头文件。

pod search只会搜索本地缓存的库,如果想搜索到最新的第三方框架或者某个框架的最新版本,必须先使用pod repo update。

iOS 开发中的 MVVM 模式——实用进阶篇(整理)

这篇文章主要介绍了实际应用 MVVM 的过程中的一些问题和解决方案

MVVM(Model View ViewModel)是一种 MVC(Model View Controller)的一种变型,来解决 MVC 中庞大复杂的 Controller 难以维护的问题。大致上讲 MVVM 有几个要求:

MVVM 和 MVC 有很多类似的特点,主要的不同有:

另外一点,MVVM 默认 View 和 View Controller 有一个一对一的关系,一般我们把这两个看做一个整体,会以 .swift 文件 和 Storyboard 的形式出现。

View Model 的工作是处理所有的展示数据的逻辑。如果一个 model 中有一个 NSDate 对象, NSDateFormatter 就会在 View Model 中用来设置日期的展示形式。

View Model 不能接触任何用户界面的部分,View Model 文件中不应该 import UIKit ,View Controller 会观察 View Model 去了解什么时候显示新的数据(通过 KVO 或者 FRP(Functional Reactive Programming))

MVVM 和 MVC 有一个共同的弱点:没有清楚的定义应该把网络请求部分放在哪里。在实际操作过程中,我会把网络请求放在 View Model 文件里面,但之后我打算把网络请求放在自己独立的一个类中,View Model 文件会拥有这个对象。

下面我们主要谈一谈实际应用 MVVM 过程中一些挑战:

例如你想构造这样一个常用的界面,有一个 segment control 在屏幕顶部,屏幕的其他部分是一个 collection view,选择不同的 segment,就会展示不同样式的 collection view,元素的排列顺序。我们定义了一个 enum 来枚举所有的排列样式:

那么这个 enum 在 MVVM 模式中应该放在哪里呢?因为这个 enum 决定了数据排列的顺序,每个 cell 中的文字和按钮的 title,这些都属于展示的逻辑,所以这个 enum 看起来应该放在 view model 中。

然而,这些 layout 并不改变要展示的数据,只是决定了要呈现的数据的排列方式和排列顺序,从这个角度上来说 enum 又应该放在 view controller 中。

我的解决方法是把 enum 放在 view model 中,然后在 view model 中加一个对外的 Observable 或者 Signal 来表示使用了哪个 layout,基于用户选择的 segment,view model 更新这个值,然后在 view controller 中根据相应的 layout 改变 collection view 的样式,view controller 也可以根据这个值来决定用哪个 cell reuse identifier

iOS 开发者在用 MVVM 和 FRP 写应用的时候最常见的问题可能就是 ViewModel 怎么把数据展现给 ViewController。当 Model 层的数据发生变化更新的时候,ViewController 需要得到通知然后做出相应的 UI 更新,我们一般会用到两种机制:

第一个选项很吸引人,因为可以在 View Controller 中决定怎么选择观察那些 property。然而,我不推荐在 Swift 中使用第一个选项,因为 Swift 在 KVO 中没有类型检查,你需要对 AnyObject 强制转换类型很多次。

第二个选项是比较 Swift 的方式,基于 Swift 的 generics 特性,signals,sequences,observables 可以支持编译过程中的类型检查。

但有时候在 view model 增加这些 Signals 或者 Observables 有些困难。Swift 的初始化方法对于什么时候对 property 赋值有非常明确的规定。Signals 或者 Observables 需要使用 view model 内部的状态,所以它们必须在 super.init() 之后才能创建,但是另一方面,我们在调用 super.init() 之前保证所有 property 已经被赋值了,包括那些 Signal/Observable property。

这是个先有鸡还是先有蛋的问题。

我采用比较简单的解决方法:定义成 var 的隐式可选类型,这样就可以在 super.init() 之后才给 property 赋值。这不是一个完美的解决办法。我们可以用 lazy var property 的闭包赋值来代替上面的方法。在 Swift 不断完善和更新的过程中,大家也可以探索其他更好的办法。

举一个很常用的例子,用户点击 collection view 中的一个 cell,跳转到详情页面。用户点击的操作应该在 view controller 中处理,具体内容是展现一个新的详情页面。但是 view controller 不能直接接触 models,我们要如何用 MVVM 模式实现这样的用户交互呢?

我的解决方案是利用 Swift 的闭包。首先在 view model 中定义一个闭包:

然后在 view model 中添加一个 property:

接着我需要调用闭包,在 view model 中定义一个view controller 可以调用的函数,这个函数的参数是可以决定使用什么数据,一般情况下常用 index path:

现在当用户选中一个 cell,会调用 view model 中的这个函数,并且传入 index path 参数,view model 决定使用哪个数据,并调用在 view controller 中定义的闭包,例如:

最后一个问题是怎么创建这个 view model。我们需要传递一个闭包给view model 的初始化函数,然后用 lazy loading 来调用 view model 的初始化函数。


文章标题:ios开发文章,ios开发文档
路径分享:http://chengdu.cdxwcx.cn/article/dsejodh.html