簡體   English   中英

在AppDelegate中運行CKQuery-等待完成

[英]Running CKQuery in AppDelegate - wait until done

我正在嘗試使用CloudKit從iCloud檢索數據。 因為我只想執行一次,所以將代碼放入AppDelegate.swift文件中的didFinishLaunchingWithOptions中。

我試圖在主線程上運行它,所以直到獲得數據后,我的第一個ViewController中的代碼才會被調用。

func getPeople() {
    let query = CKQuery(recordType: "Person", predicate: Predicate(format: "TRUEPREDICATE", argumentArray: nil))
    CKContainer.default().privateCloudDatabase.perform(query, inZoneWith: nil) { (records, error) in
        if error == nil {
            names.removeAll()
            messages.removeAll()
            pictures.removeAll()
            recordIds.removeAll()

            for record in records! {

                names.append(record.object(forKey: "name") as! String)
                messages.append(record.object(forKey: "message") as! String)
                pictures.append(UIImage(data: record.object(forKey: "picture") as! NSData as Data)!)
                recordIds.append(record.recordID)

            }

            print("done")

        } else {

            print(error)
            print(error?.code)

        }

    }

}

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
    performSelector(onMainThread: #selector(getPeople), with: nil, waitUntilDone: true)

    return true
}

但是,這似乎不起作用。 在我的ViewController中的viewDidLoad之后調用print("done") 我以前沒有使用多線程,並且我想知道如何在查詢完成之前停止其他代碼的調用。 謝謝!

不要等到數據加載完畢。 檢索它可能需要幾秒鍾,並且用戶界面將無響應。 如果長時間沒有響應,系統甚至可以終止您的應用程序。 而是在數據到達后更新視圖。 您可以使用NSNotificationCenter.defaultCenter().addObserver觀察數據更改。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM