【问题标题】:CloudKit nil optional errorCloudKit nil 可选错误
【发布时间】:2017-08-13 20:02:59
【问题描述】:

我正在尝试加载、修改并重新保存一个数组。

这里是代码,修改func是最上面的:

func modifyUserGroupsRequestee(){
    print("step2")
    acceptedUsersArray.append(groupNameLbl.text!)
    //error
    userGroupRecordToUpdate.setObject(acceptedUsersArray as CKRecordValue?, forKey: "userGroups")
    database.save(recordToUpdate) { (savedRecord, error) in
        if error != nil{
            print(error.debugDescription)
        }else{
            print("SAVED RECORD")
        } 
    } 
}

func resaveUserGroups(){
    print(addedUser)
    print("step1")
    // add group to requestees user groups
    let pred = NSPredicate(format: "username = %@", "\(addedUser)")
    let query = CKQuery(recordType: "PersonalUser", predicate: pred)
    let operation = CKQueryOperation(query: query)  
    //operation.resultsLimit = CKQueryOperationMaximumResults
    operation.recordFetchedBlock = { (record: CKRecord!) in
        if record != nil{
            self.userGroupRecordToUpdate = record
           // self.acceptedUsersArray = (record.object(forKey: "userGroups") as! Array)
            print("usergroup names:: \(self.acceptedUsersArray)")
            if let acceptedUserArrays = record.object(forKey: "userGroups") as? [String] {
               // self.feedTableView.reloadData()
                self.acceptedUsersArray = acceptedUserArrays
                print("looks like we r going forward")
                self.modifyUserGroupsRequestee() 
          //  }
            //self.feedTableView.reloadData()
            print(groupNames.count)
            print(self.acceptedUsersArray)
        }   
    }
    database.add(operation)
    //self.tableView.reloadData()
    // print(leaderboardInfo.count)
   }
}

该函数打印第 1 步,但从未到达第 2 步。在底部函数中,我尝试创建一个 if let 语句来解决我的 nil 问题(我在那行上面注释了我之前的代码-self.acceptedUsersArray ...无论如何,我相信我错误地实现了 if let 语句,因为没有数据加载,即使云套件中有数据。

我确实设置了我的个人用户 cloudKit 记录,这是一张图片:

【问题讨论】:

    标签: arrays swift if-statement optional cloudkit


    【解决方案1】:

    您应该尽量让您的代码始终保持一致的缩进。 (在 Xcode 编辑器中,Cmd+A(全选),然后 Ctrl+I(重新缩进)。)

    移除令人困惑的 cmets,您的 resaveUserGroups 显示为:

    func resaveUserGroups() {
        print(addedUser)
        print("step1")
        // add group to requestees user groups
        let pred = NSPredicate(format: "username = %@", "\(addedUser)")
    
        let query = CKQuery(recordType: "PersonalUser", predicate: pred)
    
        let operation = CKQueryOperation(query: query)
    
        operation.recordFetchedBlock = { (record: CKRecord!) in
    
            if record != nil {
                self.userGroupRecordToUpdate = record
                print("usergroup names:: \(self.acceptedUsersArray)")
    
                if let acceptedUserArrays = record.object(forKey: "userGroups") as? [String] {
                    self.acceptedUsersArray = acceptedUserArrays
                    print("looks like we r going forward")
                    self.modifyUserGroupsRequestee()
    
                    print(groupNames.count)
                    print(self.acceptedUsersArray)
                }
            }
            database.add(operation)
        }
    }
    

    省略部分说明:

    func resaveUserGroups() {
        //...
    
        operation.recordFetchedBlock = { (record: CKRecord!) in
    
            if record != nil {
                //...
            }
            database.add(operation)
        }
    }
    

    database.add(operation) 行存在于recordFetchedBlock 中。

    您可能需要修复更多部分(这是另一回事),但至少,您需要将行移出闭包以执行您创建的operation

    func resaveUserGroups() {
        //...
    
        operation.recordFetchedBlock = { (record: CKRecord!) in
    
            if record != nil {
                //...
            }
            //database.add(operation) 
        }   //↓
        database.add(operation)
    }
    

    【讨论】:

    • 我移动了一个操作行,但它并没有改变 if let 语句中的代码没有被调用的事实,即使它应该导致它不是 nil。
    • 如果将print(record) 放在 if-let 之前会得到什么?
    • 我需要单独发布此代码 sn-p 导致其太大...可选(defaultZone: __defaultOwner_), recordChangeTag=j6b336u7, values={ email = r; fullName = jacob; password = jaj; username = jacobbbb; }, recordType=PersonalUser> {
    • 第二部分...只读 creatorUserRecordID -> lastModifiedUserRecordID -> creationDate -> 2017-08-13 18:48:47 +0000 modifyDate -> 2017-08-13 18:51:50 +0000 modifiedByDevice -> 2 email -> "r"密码->“jaj”用户名->“jacobbbb”全名->“jacob”})
    • 您可以在编辑问题时包含此类信息。但我在输出中找不到任何userGroups。输入print(record.object(forKey: "userGroups")) 会得到什么?
    【解决方案2】:

    我刚刚解决了。显然,即使它刚刚创建,数组内部也总是需要某种值。我试图查询一个存在于 recordType 中但尚未在特定记录下的数组。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-06
      • 1970-01-01
      • 2017-09-19
      • 2023-04-10
      相关资源
      最近更新 更多