2015-09-05 49 views
5

我想要訪問CloudKit中的記錄值,這裏是MyPin,它有一個標題&字幕屬性/字段值。 但是它可能發生,有時記錄爲空值(在這裏字幕),並且它崩潰的時候我打電話行:代碼從Cloudkit加載空屬性時崩潰 - 使用Swift

var tempS: String = Annot["Subtitle"] as! String 

因爲Annot["Subtitle"]沒有按存在...

當我做

println(Annot["Subtitle"]) 

返回零

,但如果我這樣做:

if (Annot["Subtitle"] == nil) { 
println("just got a nil value") 
} 

我從來沒有進入if語句:

有人可以幫助我如何識別是否記錄有一個空值?

這裏是我的代碼行:

let container = CKContainer.defaultContainer()   
let publicData = container.publicCloudDatabase   
let query = CKQuery(recordType: "MyPin", predicate: NSPredicate(format: "TRUEPREDICATE", argumentArray: nil)) 
publicData.performQuery(query, inZoneWithID: nil) { results, error in 
if error == nil { // There is no error 
for Annot in results { 
var tempS: String = Annot["Subtitle"] as! String 
}} 

回答

2

一些改變,當你得到Annot["Subtitle"]它會給你一個CKRecordValue?回報具有基類爲NSObjectProtocol。因此,在你的情況下,該字段確實存在,但它不是一個字符串,因此使用as!字符串會使應用程序崩潰。由於該字段存在,所以CKRecordValue不會爲零。但該字段的內容爲零。當您打印該字段時,它將輸出該字段的.description。在你的情況下,這是零。你可以試試這個代碼,而不是:

if let f = Annot["Subtitle"] { 
    print("f = \(f) of type \(f.dynamicType)") 
} 

然後設置打印線斷點,當它停止嘗試在輸出窗口中的以下三個語句:

po Annot 
po f 
p f 

po Annot你應該看到什麼在那個紀錄裏。包括你的字幕領域。 po f沒有那麼有趣。它只會輸出一個內存地址。然而p f會告訴你實際的類型。如果它是一個字符串,你應該看到類似的東西:(__NSCFConstantString *) $R3 = 0xafdd21e0

P.S.也許你應該把它叫做記錄而不是Annot。它是一個局部變量,所以它應該以小寫字符開頭。它仍然是一個記錄,而不是一個Annot。

+0

謝謝埃德溫我設法解決您的建議問題。 –

1

我認爲你正在做正確的事情,但因爲它是在另一個線程(完成部分異步執行)執行,你看不到的println 。 試試這個:

if (Annot["Subtitle"] == nil) { 
dispatch_async(dispatch_get_main_queue()) { 
    println("just got a nil value") 
    } 
} 

看看它是否工作!

從cloudkit獲取值的方式就是這樣。這既照顧零價值和所有其他可能性。只要注意我實現了一個委託,讓我的結果返回給調用對象異步

privateDB.performQuery(query, inZoneWithID: nil) { (result, error) -> Void in 
     if error == nil{ 
      for record in result{ 
       let rec = record as! CKRecord 
       if let xxxVar = rec.valueForKey("fieldName") as? String{ 
        myArray.append(xxxVar!) //append unwrapped xxxVar to some result or whatever 
       }else{ 
        //handle nil value 
       } 
      } 
      dispatch_async(dispatch_get_main_queue()) { 
       //do something with you data 
       self.delegate?.myResultCallBack(myArray) 
       return 
      }     
     }else{ 
      dispatch_async(dispatch_get_main_queue()) { 
       self.delegate?.myErrorCallBack(error) 
       return 
      } 
     } 
    } 

當心,也有Swift2

+0

感謝您的回答,但沒有運氣,仍然沒有打印:-( –