斯威夫特解析:在_user

问题描述:

我正在开发使用SWIFT和分析应用程序无法检索一个布尔值。由于某些原因,我在_User类中实现了一个名为“modified”的Bool。我一直在玩Swift和Parse几个月,但这没有意义。斯威夫特解析:在_user

当我尝试找回价值的“修改”布尔我不断获取,即使它被设定为“真”解析服务器上的“假”值。下面是代码:

var modified: Bool = PFUser.currentUser().objectForKey("modified") as! Bool 
    println("User Modified Bool is set to: \(modified)") 

我也试图与

self.modified = PFUser.currentUser().valueForKey("modified") as! Bool 
    println("User Modified Bool is set to: \(modified)") 

self.modified = PFUser.currentUser()["modified"] as! Bool 
    println("User Modified Bool is set to: \(modified)") 

我必须做具体的查询或有直接访问该值的方法?

编辑

我实现了一个特定的查询。仍然获得了 “假” 值虽然

 var queryMainUser: PFQuery = PFUser.query() 
    queryMainUser.whereKey("username", equalTo: PFUser.currentUser().username) 
    queryMainUser.findObjectsInBackgroundWithBlock { (mainUsersObjects, mainUsersError) -> Void in 
     if (mainUsersError == nil) { 
      var theRef = mainUsersObjects[0] as! PFObject 
      self.modified = theRef["modified"] as! Bool 
      println("Any improvement? \(self.modified)") 
     } 
    } 

编辑2

继@danh建议,我试图通过实施该代码更新设备上的currentuser实例:

 var currentUser = PFUser.currentUser() 
    currentUser.fetchInBackgroundWithBlock { (object, error) -> Void in 
     println("Refreshed") 
     currentUser.fetchIfNeededInBackgroundWithBlock { (result, error) -> Void in 

      self.modified = currentUser.objectForKey("modified") as! Bool 
      var idOfUser: String = currentUser.objectId 
      println("User \(idOfUser) UPDATED") 
      println(self.modified) 
      if self.modified == true { 
       self.deleteData() 
       self.fetchAllObjects() 
      } 
     } 
    } 

当运行控制台给我这个:

Refreshed 
User xTbBw6cNzK UPDATED 
false 

下面是截图我只是把服务器端的: can't get bool from Parse

谢谢大家的关注

+0

你确定它获取col的语法吗?也许用户过时了。标志设置在云中后,您需要使用某种形式的刷新(例如http://parse.com/docs/ios/api/Classes/PFObject.html#//api/name/refreshInBackgroundWithBlock :)为了使其最新。另外,请注意PFObject实现'isDirty()'这可能是您尝试创建的函数的内置版本。 – danh

+0

hello @danh,谢谢你的回答。我看过你提到的'isDirty()'。但这不完全是我需要的。我使用“修改”bool来告诉用户刷新其朋友列表。当实现新的朋友关系时,这个布尔在服务器上被修改。 我很抱歉,但我并不完全明白你的意思是“过时”。 –

+2

当前用户是数据库中用户的代理。如果您在云代码中更改了server-sdie用户的某个属性,则除非您进行刷新,否则不会由客户端副本(currentUser)表示。 – danh

我已经初始化了“doneSetUp” VAR作为一个局部变量,它是一个int。 后来我查询刚刚登录 检查用户是否存在... 检查变量userDidSetUp解析中存在,如果是这样,我将其转换为一个int并将其分配给我做 那么局部变量doneSetUp我使用的是“doneSetUp”变量,它现在有0(假)或1(真)的值来决定,如果用户已经安装了帐户或没有,然后Segue公司的用户到正确的视图控制器。 提到所有这些代码都在我的logininbackgroundwithblock函数中。 我希望有所帮助。

query?.getObjectInBackgroundWithId(user!.objectId!, block: { 
        (user, error) -> Void in 

        if let user = user{ 

         if var userDidSetUp: AnyObject = user["doneSetUp"] { 

          self.doneSetUp = userDidSetUp as! Int 

          if self.doneSetUp == 0 { 

           self.performSegueWithIdentifier("procceedToSetup", sender: self) 

          }else{ 

           self.performSegueWithIdentifier("procceedToApp", sender: self) 

          } 


         } 

        } 

       }) 

我不确定你使用的是什么版本的swift。但是如果你使用的是Swift 2.0和Xcode 7,那么应该这样做。

这是行不通的:

let modifiedStatus = PFUser.currentUser()?["modified"] // return value will be nil 

这将肯定工作:

let modifiedStatus = PFUser.currentUser()?.objectForKey("modified") 
print(modifiedStatus) // true as per your table 

我知道这听起来很奇怪,但有些我的东西几个小时后实现我的愚蠢的错误作斗争。因此,回到目前的任务并且在几个小时后重新检查总是很好的。因此,只要确保你交叉检查以下内容:

  • 的关键在主用户类的解析
  • 您可以检索其他键值“修饰”(只是为了看看,如果没有别的比你目前的错误等一键布尔值的检索(

虽然我对雨燕2.0,但是可以肯定有一个从这个特定的代码,当涉及到移动从雨燕1.2至雨燕2.0没有发生重大变化。

刚看,如果它仍然不起作用,我们可以讨论更多的y我们的设置。

我知道这是一个旧帖子,但这里是对我有用。 这是在viewDidLoad方法中。

PFUser.currentUser()?.fetchInBackgroundWithBlock({ (object, error) -> Void in 

     var modified = PFUser.currentUser()?.objectForKey("modified")?.boolValue 

     if modified == true { 

      print(modified) // Output console displays "true" 

希望这会有所帮助。