2014-12-26 3 views
0

키를 사용하여 PFObject를 성공적으로 검색하는 데 문제가 있습니다. 결국 객체 무기 호 :키를 사용하여 PFObject 검색

var object = PFObject(className:"Topic") 
    var query = PFQuery(className:"Topic") 
    query.whereKey("title", equalTo:"Default") 
    query.getFirstObjectInBackgroundWithBlock { 
     (object: PFObject!, error: NSError!) -> Void in 
     if object != nil { 
      NSLog("The getFirstObject request failed.") 
     } else { 
      // The find succeeded. 
      NSLog("Successfully retrieved the object.") 
     } 
    } 

개체의 검색에 성공하면

user.signUpInBackgroundWithBlock { 
      (succeeded: Bool!, error: NSError!) -> Void in 
      if error == nil { 
       NetworkManager.sharedInstance.follow(object, completionHandler: { 
        (error) ->() in 
        if error == nil { 
        } 
        else { 
         println("follow topic failure") 
        } 
       }) 
      } 
      else { 
       println("signup failure") 
      } 
     } 
    } 

테스트하려면 다음과 관계를 만들려면이 사용 :

println("this is the title of the default topic") 
    println(object["title"] as String) 

콘솔 인쇄 :

this is the title of the default topic 
fatal error: unexpectedly found nil while unwrapping an Optional value 
+0

: 여기

내가 개체를 인쇄하고 signUpInBackgroundWithBlock에 대한 같은 object을 사용하는 일을 제안 무엇인가? –

+0

은 user.signupinbackground with block 바로 앞에 있습니다. 나는 그 문제가 있다고 생각하지 않는다. – user2913669

+1

그것이 당신의 getFirstObjectInBackgroundWithBlock 외부에 있다면 그것은 확실히 문제이다. 나는 설명 할 것이다 ... 1 초 ... –

답변

1

y 현재 getFirstObjectInBackgroundWithBlock 블록 외부에 object["title"]을 인쇄하려고 시도하면 현재 코드가 몇 가지 문제를 일으킬 것입니다.

(1) 나는 당신이 당신의 코드 상단에 생성 된 object PFObject, 즉 var object = PFObject(className:"Topic"),하지의 범위 내에서 사용하기 위해 getFirstObjectInBackgroundWithBlock에 의해 생성 된 object에서 인쇄하려고 할 것 같아요; 그러나 그 PFObject object 외부의 getFirstObjectInBackgroundWithBlock 결코 검색되지 않았습니다.

(2) getFirstObjectInBackgroundWithBlock 블록이 비동기 적으로 실행됩니다. 블록이 백그라운드에서 페치되고 즉시 사용할 수 없을 수도 있습니다. 따라서 PFObject object 외부에 getFirstObjectInBackgroundWithBlockPFObject object이 포함되도록 설정되어 있어도 getFirstObjectInBackgroundWithBlock이 반환 된 경우 getFirstObjectInBackgroundWithBlock은 외부에서 object["title"]을 인쇄하려고 할 때 여전히 개체를 가져올 수 있기 때문에 해당 개체가 블록 외부에서 사용될 준비가되어 있다고 보장 할 수 없습니다. 블록의

(3) 심지어 블록에서 실제로는 성공했을 때 요청이 실패했다는 것을 인쇄하고있는 if object != nil 이후로 귀하의 조건을 이해하지 못하는 것 같습니다. 당신이 그`println`s를 가하고 있습니다

// fetchedObject is a global variable created to store 
// the retrieved object, but make sure the 
// getFirstObjectInBackgroundWithBlock has had time to 
// fetch the object before trying to use fetchedObject; 
// also check to make sure it's non-nil 
var fetchedObject:PFObject! 

func signUp() { 

    var query = PFQuery(className:"Topic") 
    query.getFirstObjectInBackgroundWithBlock { 
     (object: PFObject!, error: NSError!) -> Void in 
     if object != nil { 

      // Save the object as a global object for use 
      // outside of this method 
      self.fetchedObject = object 

      // The find succeeded. 
      println("Successfully retrieved the object.") 
      println("This is the title of the default topic:") 
      if let defaultTopic:String = object["title"] as? String { 
       println(defaultTopic) 
      } 

      user.signUpInBackgroundWithBlock { 
       (succeeded: Bool!, error: NSError!) -> Void in 
       if error == nil { 
        NetworkManager.sharedInstance.follow(object, completionHandler: { 
         (error) ->() in 
         if error == nil { 
         } 
         else { 
          println("follow topic failure") 
         } 
        }) 
       } 
       else { 
        println("signup failure") 
       } 
      } 
     } else { 
      println("The getFirstObject request failed with error: \(error)") 
     } 
    } 
} 
+0

자세한 설명을 가져 주셔서 감사합니다. 블록 외부에서 PFObject, object를 어떻게 호출 할 수 있습니까? 나는 그것이 여전히 블록의 범위에 국한되어 있다고 생각한다. – user2913669

+0

@ user2913669 그건 제가 포인트 2로 설명하려고하는 것입니다. PFObject는 백그라운드에서 페치되고 즉시 사용할 수 없으므로 해당 메서드에서 블록 외부에서 사용할 수 없습니다. –

+0

감사합니다.이 경우 블록 외부에서 검색된 PFObject를 호출 할 수 없습니까? 이 문제를 해결하기위한 일반적인 해결책은 무엇입니까? – user2913669

관련 문제