2017-09-30 11 views
1

Parse 서버의 데이터가있는 변수를 클래스 바로 아래에 선언 된 변수로로드하는 쿼리가 몇 개 있습니다. 쿼리 함수 내에서 변수를 인쇄 할 때 올바르게 인쇄되지만 함수 외부에서 호출하거나 인쇄 할 때 변수는 비어 있습니다. 내가 잘못 가고있는 어떤 생각?변수가 클래스 뒤에 선언 된 경우에도 쿼리 함수 밖의 변수에 액세스 할 수 없습니다.

변수 선언 :

class AddTaskViewController: UIViewController, UITextFieldDelegate, UIPickerViewDataSource, UIPickerViewDelegate { 
var varCost = "" 

쿼리로드 변수 : 내가 옵션 1을 인쇄 할 때

let varCostQuery = PFQuery(className: "Class1") 
varCostQuery.findObjectsInBackground(block: { (objects, error) in 
    if error != nil { 
     print(error!) 
    } else { 
     varCostQuery.whereKey("Header", equalTo: self.HeaderSelection.text) 
     varCostQuery.findObjectsInBackground(block: { (objects, error) in 
      for object in objects! { 
       self.varCost = object["pricePerUnit"] as! String 
       print(self.varCost) //Option1 
      } 
     }) 
    } 
}) 
print(varCost) //Option2 

, 나는 내가 찾고 정확히 같은 데이터를 얻을,하지만 난 옵션 2를 인쇄 할 때 또는 시도 이 레벨에서 varCost 변수를 사용하면 변수가 결코 업데이트되지 않은 것처럼 ""이됩니다.

답변

1

findObjectsInBackground 메서드에 전달되는 코드가 인 경우에만으로 실행되는 코드이므로 모든 개체를 찾은 경우 발생합니다.

이 코드는 개체를 찾은 경우에만 호출되기 때문에 약간 시간이 걸릴 수 있으므로이 코드는 개체가 발견 될 때까지 기다리는 백그라운드 큐로 보내집니다.

나머지 코드는 일시 중지하고 기다리는 것을 원치 않습니다. 프로그램이 느려질 것입니다. 따라서 프로그램은 완료 될 때까지이 블록을 계속지나갑니다. 그래서 옵션 2은 비어 있습니다. 왜냐하면 findObjectsInBackground에 아직 오브젝트를 가져올 시간이 없었기 때문에 코드는 바로 옵션 2으로 넘어갔습니다.

개체가 마침내 발견되면 코드 블록이 호출되고 옵션 1이 인쇄됩니다.

즉, self.varCost은이 블록 내에서 올바른 값을 가질 수 있습니다 (또는 클로저, Swift에서 호출 됨).

+0

아, 맞아. 어떤 권고 사항을 고치는 방법? 최종 쿼리 이후에 1 초의 시간을 들여서 변경 작업을 수행 할 수 있으며 UX에 너무 많은 영향을 미치지는 않을 것입니다. 그러나 더 나은 옵션을 고려해 보면 기쁠 것입니다. – tmcgee

+1

@ tmcgee 1 초의 포즈를 취하는 것은 좋은 습관이 아닙니다. 왜냐하면이 물체 발견이 얼마나 오래 걸릴지 모르기 때문입니다. 블럭 안의 매개 변수로'self.varCost'를 가진 함수를 호출하는 것이 더 좋을 것입니다, 그래서 당신은이 함수 내에서'self.varCost'로 원하는 것을 할 수 있습니다, 그리고 당신은 ** 100 % 확실합니다 ** 그것은 올바른 값입니다. –

+0

예제에 대한 링크가 있습니까? 정적 인 일시 중지보다 훨씬 나은 접근 방식과 비슷합니다. 일시적으로 문제를 해결할 수 있는지 알아보기 위해 일시 ​​중지를 시도했지만 여전히 인쇄하고 있습니다. : / – tmcgee