iOS开发月报#13|201907

这里记录过去一个月,我看到的值得分享的内容,包含但不限于iOS知识,每个月的最后一天发布。
欢迎推荐内容,可以前往zhangferry/iOSMonthlyReport提交issue。

Tips

Golbal queues的优先级

如果要在后台执行非UI相关的工作, 一般把这部分工作放在Global queue. Global queue是一种系统内共享的并行的队列。申请Global queue的方法很简单:

1
let userQueue = DispatchQueue.global(qos: .userInitiated)

其中后面的.userInitiated参数代表队列的优先级。该优先级公有6中分类,有高到低为:
userInteractive>default>unspecified>userInitiated>utility>background
通过该段代码验证:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
for i in 1...3 {
DispatchQueue.global(qos: DispatchQoS.QoSClass.default).async {
NSLog("DispatchQoS.QoSClass.default, %d", i)
}

DispatchQueue.global(qos: DispatchQoS.QoSClass.background).async {
NSLog("DispatchQoS.QoSClass.background, %d", i)
}

DispatchQueue.global(qos: DispatchQoS.QoSClass.unspecified).async {
NSLog("DispatchQoS.QoSClass.unspecified, %d", i)
}

DispatchQueue.global(qos: DispatchQoS.QoSClass.userInitiated).async {
NSLog("DispatchQoS.QoSClass.userInitiated, %d", i)
}

DispatchQueue.global(qos: DispatchQoS.QoSClass.userInteractive).async {
NSLog("DispatchQoS.QoSClass.userInteractive, %d", i)
}

DispatchQueue.global(qos: DispatchQoS.QoSClass.utility).async {
NSLog("DispatchQoS.QoSClass.utility, %d", i)
}
}

其中userInitiatedLIFO(后进先出),即如果有新插入的userInteractive级别的队列任务,为先执行新任务之后再执行之前该级别任务。其余优先级的队列任务均是FIFO(先进先出)

“No such module” when using @testable in Xcode Unit tests

因为测试工程和主工程分属不同Module,所以如果我们想在测试项目中调用主工程代码需要导入主工程:

1
@testable import moduleName

这个时候如果报以上错误,会有以下可能:
1、targetName错误
这个可以去Target->Build Setting->Product Module Name确认。
2、主工程和测试模块支持版本号不一致
保证Build Setting->iOS Deployment Target中的版本号在主工程和测试工程中一致。

authenticating with the app store上传卡顿

如果往AppStoreConnect传包一直卡在这个步骤,可以试一下这种方式:
第一步:cd ~
第二步:mv .itmstransporter/ .old_itmstransporter/
第三步:"/Applications/Xcode.app/Contents/Applications/Application Loader.app/Contents/itms/bin/iTMSTransporter"
等待执行完成。

订阅的freetrial没有标明截止时间被拒

如题,如果订阅功能含freetrial,一定要在freetrial按钮旁边标清楚试用的截止时间。

WakaTime

一款能够统计开发时间的网页端应用,支持众多IDE。

集成到IDE之后,注册账号然后会获取到一个Key,绑定该值。然后当我们愉快的开发时,一些开发的信息就会被记录下来。我们可以通过其网页端的dashboard查看我们开发的情况。

因为前几天升级XCode,需要重新装插件,所以最近几天的开发记录为空。

Lookin | 免费好用的iOS UI调试软件

出自QMUI团队,可能是小集的影响力已经很大了,这个软件首发之后竟发现已经有一众人开始关注这个东西了。可能因为UI调试这个操作是一个高频的行为,而Xcode目前又做的不够好,所以大家都期待有一个高效的UI调试工具。我也是下下来试了下,结合之前对RevealSherlock的使用,说下自己的体会吧,首先是优点:
1、免费
2、支持动态修改UI元素属性,例如位置,颜色,圆角这些
3、可以查看CALayer的信息
因为是刚发布没多久,还是有些需要改进的地方的
1、动态修改UI元素的信息,均是通过UIView,和CALayer的信息进行修改,无法实现像UILabel改文案,更新行数等操作
2、3D的渲染有时候会有bug出现,位置不正确,另外仅支持一个左右的旋转不支持上下
3、屏幕适配还不支持,不能修改屏幕
其实我对sherlock也都仅限于使用,中和频率不高的使用性和高昂的费用,我选择试用结束就放弃,虽然Lookin还存在一些不足,但是免费大于一切啊,希望可以做的更好,为更多开发者带来便利。

Github

R.swift

Android开发中引用资源可以通过R机制,所谓R机制就是在我们创建一个Android项目的时候,IDE会自动帮我们创建一个名为R的类型,它所在的文件名称也是叫做R.java,R类型中没有任何方法,包含的是代表不同类型资源的内部静态类,而这些内部静态类中,也只有静态的属性,每个属性代表一个资源,故我们要引用某个资源类型中的某个资源,可用R.资源类型.资源名来引用。下面就是代码中的实例:

1
2
//  从图片资源文件夹中加载名为"image_test"的图片以其创建位图
Bitmap aBitmap = BitmapFactory.decodeResource(this.getResources(), R.drawable.image_test);

相对来说iOS中的资源引用就麻烦很多,需要通过字符串引用,无法代码补全,资源更换无法自检查。解决iOS资源引用的这些问题而借鉴Android方案的R.Swift应运而生。
传统的方式:

1
2
let settingsIcon = UIImage(named: "settings-icon")
let gradientBackground = UIImage(named: "gradient.jpg")

使用R.Swift

1
2
let settingsIcon = R.image.settingsIcon()
let gradientBackground = R.image.gradientJpg()

不光图片,它还支持FontsResource filesColorsLocalized stringsStoryboardsSeguesNibsReuseable Cells
我第一次见到这玩意的时候就一个感受:wocao,🐂🍺!
更多关于R.Swift的使用规则参照官网说明。

Swift-Books

github上的内容,可以分为两类,纯干货和干货的整理。这个库属于后者,是一个收录Swift&Object-C相关资料的仓库。收录的都是比较经典的学习资料,而且非常全!
建库已经两年了,但是star却不多,不知道是因为曝光度的问题,还是因为大家对设计版权问题的内容有些警惕。但不管怎样吧,我还是要推一推这个库。

open-source-ios-apps

开源的iOS应用列表。基本涵盖了iOS开发涉及的所有领域,通过完整的app去学习别人的开发技巧是一个相对直观的方式,面对这个大礼包,记得来看一看哈。

Chinese-Podcasts

中文博客的收录,包含科技,风投,生活,电影,设计等领域。
音频内容最大的优势就是便捷,你可以在走路,跑步,甚至休息的时候使用它。音频相比视频还有一个更大的好处是,它会给大脑预留更多的想象空间,听音频我们会思考的更多一些。
去年一直在听东吴同学会,最近一段时间则听ggtalk和硅谷早知道多一些。

文摘

1、

生存是一种即时策略游戏,所有的人都是这场游戏的玩家。财务自由了,就是游戏赢家。
–《科技爱好者周刊:66期》

2、

我以为别人尊重我,是因为我很优秀。慢慢的我明白了,别人尊重我,是别人很优秀;优秀的人更懂得尊重别人,对人恭敬其实是在庄严你自己。

3、

所谓成熟的人,就是精神上能够自给自足的人。

Donate comment here