1

内部でperformQuery他の人performQueryが呼び出されています。recordTypeどちらも引数は同じですが、spredicateが異なります。

2 番目performQueryは返されず、アプリは実行され、CloudKit が応答するのを待ちます。

擬似コードは次のようになります。

publicDatabase.performQuery(CKQuery(recordType: recordTypeSrc, predicate: predicate), inZoneWithID: nil, completionHandler: {records, error in

    if error == nil {

        //.. problem is not name collision or reusing the same parameter, coming codepart is called though other methods

        publicDatabase.performQuery(CKQuery(recordType: recordTypeSrc, predicate: predicate2), inZoneWithID: nil, completionHandler: {records, error in

            //THIS LINE WILL NEVER GET REACHED

            if error == nil {

            } else {
                println(error.localizedDescription)
            }
            dispatch_semaphore_signal(sema2)
        })
        dispatch_semaphore_wait(sema2, DISPATCH_TIME_FOREVER)

        //..

    } else {
        println(error.localizedDescription)
    }
    dispatch_semaphore_signal(sema)
})
dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER)
4

2 に答える 2

0

セマフォのスレッドの問題のようです。sama パラメータを再利用しています。最後の dispatch_semaphore_signal は、else 内で上に移動する必要があります。その後、最初の dispatch_semaphore_wait を完全に削除できます。したがって、次のようになります。

publicDatabase.performQuery(CKQuery(recordType: recordTypeSrc, predicate: predicate), inZoneWithID: nil, completionHandler: {records, error in

    if error == nil {

        //.. problem is not name collision, it is nested though other blocks

        publicDatabase.performQuery(CKQuery(recordType: recordTypeSrc, predicate: predicate2), inZoneWithID: nil, completionHandler: {records, error in

            //THIS LINE WILL NEVER GET REACHED

            if error == nil {

            } else {
                println(error.localizedDescription)
            }
            dispatch_semaphore_signal(sema)
        })

        //..

    } else {
        println(error.localizedDescription)
        dispatch_semaphore_signal(sema)
    }
})
dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER)
于 2014-10-10T09:16:55.143 に答える