以下のような弱い自己を使用するコードをよく見かけます。
api.call() { [weak self] (result, error) in
if (error == nil) {
setGlobalState()
self?.doSomething()
} else {
setSomeErrorState()
self?.doSomethingElse()
}
}
しかし、self が nil の場合、 setGlobalState() は実行されたが self?.doSomething() は実行されなかったため、状態が矛盾しているように思えます。
次のようにするのが賢明なようです。
api.call() { [weak self] (result, error) in
guard let self = self else { return }
if (error == nil) {
setGlobalState()
self.doSomething()
} else {
setSomeErrorState()
self.doSomethingElse()
}
}
最初のケースでの原子性の欠如についての私の懸念は正当ですか? 弱い自己を使用するブロックに関しては、後者のケースがベスト プラクティスである必要がありますか?