[TIL] 梅雨提早到來的五月

记录日常开发中遇到的

  1. 新知
  2. 对旧知识的新认知
  3. 重新唤起的记忆
  4. 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")

参考链接:

  1. https://objccn.io/issue-9-2/
  2. https://github.com/ZipArchive/ZipArchive/issues/326
    • 这其中提到一个真实发生的案例,在 iOS 10.2 中使用 UTF8String 来创建文件名,很有可能在 iOS 10.3 上无法打开。这其中的原因,大概率在于 10.2 的文件系统是 HFS+,而 10.3 是 APFS

05/19

stat - st_size 是什么类型

获取文件大小的方式:

  1. FileAttributeKey
let attr = try FileManager.default.attributesOfItem(atPath: filePath)
let fileSize = attr[FileAttributeKey.size] as? UInt64
  1. stat
let representation = FileManager.default.fileSystemRepresentation(withPath: filePath)
var fileStat = stat()
lstat(representation, &fileStat)
let fileSize = fileStat.st_size

05/14

AVPlayer

一篇非常简明的阐述如何使用 AVPlayer 的文章:

https://medium.com/free-code-camp/how-to-set-up-video-streaming-in-your-app-with-avplayer-7dc21bb82f3

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 介绍了

ILow-Latency HLS


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