好的,我们都知道,在 Swift 的传统并发中,如果您在类中执行(例如)网络请求,并且在完成该请求时您引用了属于该类的函数,则必须传入[weak self],例如这:
func performRequest() {
apiClient.performRequest { [weak self] result in
self?.handleResult(result)
}
}
Run Code Online (Sandbox Code Playgroud)
这是为了阻止我们self在闭包中强烈捕获并导致不必要的保留/无意中引用已经从内存中删除的其他实体。
在异步/等待中怎么样?我在网上看到了相互矛盾的事情,所以我只想向社区发布两个示例,看看您对这两个示例有何看法:
class AsyncClass {
func function1() async {
let result = await performNetworkRequestAsync()
self.printSomething()
}
func function2() {
Task { [weak self] in
let result = await performNetworkRequestAsync()
self?.printSomething()
}
}
func function3() {
apiClient.performRequest { [weak self] result in
self?.printSomething()
}
}
func printSomething() {
print("Something")
}
}
Run Code Online (Sandbox Code Playgroud)
function3很简单 - 老式并发意味着使用[weak self].
function2我认为是对的,因为我们仍在闭包中捕获内容,所以我们应该使用[weak …
我有一些项目的集合视图。在我的 UI 测试期间,我点击一个按钮,这将触发一个网络请求,该请求完成后,将在索引 0 处将一个单元格插入此集合视图中。尽管此网络请求来自本地服务器,但它仍然需要一两次即可完成。
我想等待输入新单元格,并检查它是否具有正确的值。这将是按钮背后的功能已起作用的视觉确认。
我该怎么做呢?我无法使用,application.collectionViews.cells.element(boundBy: 0)因为该位置已经有一个单元格,所以它会立即找到它,但它会有错误的值。
我基本上需要通过子视图查询集合视图单元格。像这样的东西:
let predicate = NSPredicate(format: "staticTexts['Title Label I'm after'].exists == 1")
application.collectionViews.cells.element(matching: predicate)
Run Code Online (Sandbox Code Playgroud)
但这不起作用,事实上它崩溃了,大概是因为 staticTexts 对谓词解析器不可用。
我在想的另一件事是,我构建了自己的版本,XCTestExpectation该版本每秒运行一次,并运行一个处理程序,该处理程序将获取第一个单元格并检查其内容。