はじめに
「メソッドがエラーをthrowさせたいとき、そのメソッドの同期実行クロージャの中のtryはどうすんの、クロージャの外にthrowできないのにどうすんのさ」っていうのを度々忘れるんだけど、それの解決策としてはerrorの変数を用意し、同期実行のクロージャでcatchしたらその変数にセットしてそこでthrowするだけですね、という話。
func perform() throws {
// クロージャの中のerrorを取り出す
var _error: Error!
// こいつが同期実行のクロージャ
performAndWait {
do {
try self.save()
} catch {
_error = error
}
}
if let error = _error {
throw error
}
}
ちなみに、どのような場合にこんな事をやることになったかというと、Core Dataで別スレッドでconetxtに一気に書き込んで、それを親のcontextへ再帰的に反映するときに利用した。