[TIL] 梅雨提早到來的五月
记录日常开发中遇到的
- 新知
- 对旧知识的新认知
- 重新唤起的记忆
- review 中遇到的一些有趣的问题
05/30
byWordWrapping - 孤独的单词
有一段类似下面这样的代码,和一个字符串 “This message could not be delivered”,假设 label 的宽度正好会导致字符串在 delivered 前被截断。
label.numberOfLines = 0
label.lineBreakMode = .byWordWrapping
这时候,下面这样的换行方式是不会出现的:
This message could not be
delivered
实际上得到的字符串是以下:
This message could not
be delivered
乍一看,多少让人有些摸不着头脑,然而这是一个 Apple 刻意而为之的设计,目的在于避免孤词寡行的出现。参考链接:
个人认为这是一个有趣的设计,然而并没有任何途径可以禁止这种换行方式,这多少会带来一些不便,好在从 iOS 14 开始,终于可以通过设置 lineBreakStrategy
来避免这样的换行。
if #available(iOS 14.0, *) {
label.lineBreakStrategy = []
}
05/27
fileSystemRepresentation
最近依然在为 ZIPFoundation 做 zip64 的支持,当使用 fopen
打开指定路径的文件时,使用的是类似下述的代码。在 POSIX 系统中直接使用 UTF8String
并不是一个明智的办法,使用 fileSystemRepresentation
先将字符串转换成文件系统的规范形式然后用 UTF-8
编码会比较安全。
let representation = FileManager.default.fileSystemRepresentation(withPath: path)
let file: UnsafeMutablePointer<FILE> = fopen(representation, "r+b")
参考链接:
- https://objccn.io/issue-9-2/
- https://github.com/ZipArchive/ZipArchive/issues/326
- 这其中提到一个真实发生的案例,在 iOS 10.2 中使用
UTF8String
来创建文件名,很有可能在 iOS 10.3 上无法打开。这其中的原因,大概率在于 10.2 的文件系统是HFS+
,而 10.3 是APFS
。
- 这其中提到一个真实发生的案例,在 iOS 10.2 中使用
05/19
stat - st_size 是什么类型
获取文件大小的方式:
- FileAttributeKey
let attr = try FileManager.default.attributesOfItem(atPath: filePath)
let fileSize = attr[FileAttributeKey.size] as? UInt64
- stat
let representation = FileManager.default.fileSystemRepresentation(withPath: filePath)
var fileStat = stat()
lstat(representation, &fileStat)
let fileSize = fileStat.st_size
- 关于
st_size
的类型,根据 link1,它是off_t
;根据 link2,off_t
是__darwin_off_t
;根据最后一个 link,可以知道其实是int64
。必须要注意的是,尽管用于表示 size,它并非一个无符号的数。
05/14
AVPlayer
一篇非常简明的阐述如何使用 AVPlayer
的文章:
HLS - HTTP Live Streaming
HLS 是一个 Apple 定义的流传输协议,基于 HTTP 实现,我们会发现它的后缀是 .m3u8
,也就是用 UTF-8
编码的 Unicode 版本 M3U
。对于视频技术知之甚少的我而言又要问,那 M3U 是什么,根据维基,M3U 文件是一种纯文本文件,可以指定一个或多个多媒体文件的位置。
关于 HLS 是什么,m3u8
的结构是什么样,文档中的图片非常清晰易懂:https://developer.apple.com/library/archive/referencelibrary/GettingStarted/AboutHTTPLiveStreaming/about/about.html
HLS 拥有高性能,高兼容性,作为代价,切片和查询导致了较高的延迟。2019 年,Apple 介绍了
05/13
lineHeight and lineSpacing
无法通过 UILabel
的属性来直接设置行高,但是可以为 Attributed String 来设置这些值。
除了 lineSpacing,我们还可以使用 lineHeight 相关的几个属性,例如:
minimumLineHeight
maximumLineHeight
lineHeightMultiple
但事实上 iOS 的行高和 CSS Flexbox 中以及通常认知中的行高并不完全相同。参见下图:
所以如果需要通常意义上的行高,可以通过设置 baselineOffset 来实现。
let paragraphStyle = NSMutableParagraphStyle()
paragraphStyle.lineHeightMultiple = 1.6
label.attributedText = NSAttributedString(
string: "......",
attributes: [
.baselineOffset: ......,
.paragraphStyle: paragraphStyle
]
)
05/07
Apple's Compression Algorithms
当讨论一个压缩算法的时候,压缩率和速度是最重要的两个维度。
Apple 自己的压缩框架也提供了多种算法:
WWDC2015 Session 712
Balanced: zlib
and lzfse
High compression, slow: lzma
Low compression, fast: lz4
05/06
setUp()/tearDown()
- instance method: each test method
- class method: all test methods
globallyUniqueString
一般来说提到唯一标志符我们常常会先想到 UUID
,例如用下述方法来生成独一无二的字符串:
UUID().uuidString
但如果我们需要创建临时文件,那使用进程级别的唯一字符串也不失为一个好办法。其中包含了主机名,进程 ID,时间戳,来保证其唯一性。
ProcessInfo.processInfo.globallyUniqueString