CloudKitからレコードを取得する関数を作成したい、一時的なネットワークエラーが発生した場合、関数は再試行する必要がある。Swiftネストされた関数とクロージャ変数
ここでの出会いにそれがネストされた関数internalWorkを(呼び出すことによって再試行エラーを取得した場合、私は、そのような機能(簡易)を定義func fetchRecord(withRecordID recordID: CKRecordID, returnBlock: (optError: ErrorType?) -> Void){
func internalReturnBlock(optError optError: ErrorType?){
if NSThread.isMainThread() {
returnBlock(optError: optError)
}
else{
dispatch_async(dispatch_get_main_queue(), {
returnBlock(optError: optError)
})
}
}
func internalWork(){
privateDB.fetchRecordWithID(recordID) { (optRecord, optError) in
if let error = optError{
// IF NETWORK ERROR RETRY
internalWork()
}
else{
internalReturnBlock(optError: nil)
}
}
}
internalWork()
}
)
私の質問は、ネストされた関数を使用するか、または作成の違いがどうなるかでありますローカルクロージャ変数? 例えば、ここで私は、クロージャ変数にinternalReturnBlockを変更します。
func fetchRecord2(withRecordID recordID: CKRecordID, returnBlock: (optError: ErrorType?) -> Void){
var internalReturnBlock = { (optError: NSError?) in
if NSThread.isMainThread() {
returnBlock(optError: optError)
}
else{
dispatch_async(dispatch_get_main_queue(), {
returnBlock(optError: optError)
})
}
}
func internalWork(){
privateDB.fetchRecordWithID(recordID) { (optRecord, optError) in
if let error = optError{
// IF NETWORK ERROR RETRY
internalWork()
}
else{
internalReturnBlock(nil)
}
}
}
internalWork()
}
可変ブロック対ネストされた関数を使用しての違いは何ですか? 利点や問題はありますか?
私の本を読んで参考になるかもしれません。http://www.apeth.com/swiftBook/ch02.html#_anonymous_functions宣言された関数から匿名関数に切り替えるという私の動機は、基本的に名前が不要であることに注意してください。 – matt
詳細な回答ありがとうございました!私は、closure変数が少なくとも宣言する方法ではclosure変数を呼び出すことができないことも知ったので、internalWork()はネストされた関数として残る必要があります。 –
良い点!その限界を回避する方法があります。しかし、私はあなたの再帰がとても良いアイデアであるとは確信していません。私たちが決して通過できない場合はどうですか?最終的に実際のスタックオーバーフローが発生します。 – matt