CoreData
Swift

メソッドがthrowしたいときにそのメソッドの同期実行クロージャの中のtryはどうすんの

More than 1 year has passed since last update.

はじめに

「メソッドがエラーを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へ再帰的に反映するときに利用した。

参考

https://github.com/tonyfresher/notes-ios/blob/e12456b87425e43874bff4d4c190ea1e77c61476/Notes/Core%20Data/Extensions/NSManagedObjectContext%2BNotes.swift#L17-L30