2015-09-05 16 views
5

Tôi đang cố gắng truy cập vào giá trị bản ghi trong CloudKit, tại đây MyPin, nó có tiêu đề giá trị trường/trường phụ đề &. Tuy nhiên nó có thể xảy ra mà đôi khi giá trị kỷ lục là rỗng (ở đây phụ đề), và nó bị treo tại cửa sổ dòng khi tôi gọi:Lỗi mã khi tải thuộc tính trống từ Cloudkit - bằng cách sử dụng Swift

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

Annot["Subtitle"] doesn tồn tại ...

Khi tôi làm

println(Annot["Subtitle"]) 

nó sẽ trả về nil

nhưng nếu tôi làm:

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

Tôi không bao giờ nhập câu lệnh if:

Ai đó có thể giúp tôi làm cách nào để xác định xem bản ghi có giá trị rỗng không?

Đây là dòng của tôi về mã:

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 
}} 

Trả lời

2

khi bạn nhận được Annot["Subtitle"] nó sẽ cung cấp cho bạn một lợi nhuận CKRecordValue? trong đó có một lớp cơ sở của NSObjectProtocol. Vì vậy, trong trường hợp của bạn trường tồn tại nhưng nó không phải là một String để đúc nó bằng cách sử dụng như! Chuỗi sẽ làm hỏng ứng dụng của bạn. Vì trường tồn tại, CKRecordValue sẽ không phải là số không. Tuy nhiên, nội dung của trường đó là không. Khi bạn in trường, nó sẽ xuất ra .description của trường đó. Trong trường hợp của bạn là không. bạn có thể thử mã này thay vì:

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

sau đó thiết lập một breakpoint trên dòng in và khi nó dừng lại thử ba câu sau đây trong cửa sổ đầu ra của bạn:

po Annot 
po f 
p f 

Sau po Annot bạn sẽ thấy những gì trong hồ sơ đó. Bao gồm trường phụ đề của bạn. Các po f không phải là quá thú vị. Nó sẽ chỉ xuất ra một địa chỉ bộ nhớ. Tuy nhiên, p f sẽ hiển thị cho bạn loại thực tế. Nếu đó là một chuỗi, bạn sẽ thấy một cái gì đó như: (__NSCFConstantString *) $R3 = 0xafdd21e0

P.S. Có lẽ bạn nên gọi nó là kỷ lục thay vì Annot. Đó là một biến cục bộ nên nó sẽ bắt đầu bằng ký tự chữ thường. Và nó vẫn là một kỷ lục chứ không phải Annot.

+0

Cảm ơn Edwin Tôi đã cố gắng khắc phục sự cố với lời khuyên của bạn. –

1

Tôi nghĩ rằng bạn đang làm đúng, nhưng bạn không thấy println vì nó được thực hiện trong chủ đề khác (phần hoàn thành được thực hiện không đồng bộ) . Hãy thử cách này:

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

và xem nó có hoạt động không!

Cách tôi nhận giá trị từ cloudkit theo cách này. Điều này cả hai đều chăm sóc các giá trị nil và tất cả các sự kiện khác. Chỉ cần lưu ý tôi đã thực hiện một đại biểu để có được kết quả của tôi trở lại các đối tượng gọi điện thoại không đồng bộ

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 
      } 
     } 
    } 

Hãy coi chừng, có một số thay đổi trong Swift2

+0

Cảm ơn câu trả lời của bạn nhưng không may mắn với điều đó, vẫn không in nó :-( –

Các vấn đề liên quan