2015-12-14 3 views
0

, используя следующий код Swift, мне нужно напечатать значение 5/hhhh. Во-первых, hhhh устанавливается в ноль в «var hhhh: Int = 0», затем внутри блока «getObjectInBackgroundWithId» значение hhhh обновляется с помощью «hhhh = appleCount [" count "] as! Int", используя данные, которые были просто спросил от Парса. Затем мне нужно каким-то образом получить доступ к обновленному значению hhhh вне блока «getObjectInBackgroundWithId» и напечатать следующее значение «print (5/hhhh)», но значение hhhh по-прежнему равно нулю в этой строке, и я получаю NAN эта операция. osteven любезно дал мне несколько советов о том, почему значение HHHH равно нулю в этой точке здесь:Как получить доступ к значению переменной вне блока getObjectInBackgroundWithId Parse

Local and Global variables in Swift

Но, я не понял, способ каким-то образом передать обновленное значение HHHH на внешней стороне «getObjectInBackgroundWithId» блокировать и использовать это значение при «print (5/hhhh)» вместо нуля. Любая помощь или советы о том, как сделать это произойдет высоко ценятся

import UIKit 
import Parse 
class NewsPageViewController: UIViewController { 

override func viewDidLoad() { 
super.viewDidLoad(
var hhhh:Int = 0 
var tttt:Int = 0 
var cccc:Int = 1 

if cccc == 1 { 
    var query = PFQuery(className: "Count") 
    query.getObjectInBackgroundWithId("RhC25gVjZm", block: { (object: PFObject?, error: NSError?) -> Void in 
     if error != nil { 
      print(error) 
     } else if let appleCount = object { 
      appleCount["count"] = appleCount["count"] as! Int + 1     
      hhhh = appleCount["count"] as! Int 
      appleCount.saveInBackground() 
     } 
    }) 
} 
print(5/hhhh) 

}

ответ

1

Ответ вы уже даны разъяснения по вопросу хорошо, на мой взгляд, я попытаюсь перефразировать вопрос, чтобы помочь вам понять, как это исправить.

Функция getObjectInBackgroundWithId запускает блок в другое время по сравнению с оператором текущей печати (5/hhhh).

Таким образом, значение «hhhh» обновляется, однако вы пытаетесь вызвать значение hhhh в инструкции печати до того, как блок в getObjectInBackgroundWithId успел запустить и обновить.

Другими словами,

print(5/hhhh) 

происходит прежде, чем этот блок кода выполняется (из-за природы фоновых потоков),

query.getObjectInBackgroundWithId("RhC25gVjZm", block: { (object: PFObject?, error: NSError?) -> Void in 
    if error != nil { 
     print(error) 
    } else if let appleCount = object { 
     appleCount["count"] = appleCount["count"] as! Int + 1     
     hhhh = appleCount["count"] as! Int 
     appleCount.saveInBackground() 
    } 
}) 

Способ использования переменной HHHH один раз вы знаете, что оно было обновлено, было бы создание функции для использования (в вашем случае печати) переменной и вызова ее внутри блока, например:

Пример кода:

func doSomethingWithHHHH(){ 
    print(5/hhhh) 
} 

query.getObjectInBackgroundWithId("RhC25gVjZm", block: { (object: PFObject?, error: NSError?) -> Void in 
     if error != nil { 
      print(error) 
     } else if let appleCount = object { 
      appleCount["count"] = appleCount["count"] as! Int + 1     
      hhhh = appleCount["count"] as! Int 
    //HERE YOU CALL ON THE FUNCTION TO USE THE VARIABLE 
      doSomethingWithHHHH() 
      appleCount.saveInBackground() 
     } 
    }) 

В этом примере оператор печати должен работать, так как переменная была обновлена ​​в блоке до функции называется использовать переменную «хххх».

+0

Очень прост и объяснительный MHomer, спасибо за ответ.Теперь я лучше понимаю, что происходит. Я также добавил несколько заметок, которые я понял за последние несколько часов, исследуя мою проблему. Итак, теперь проблема у меня решена благодаря вам, ребята. – NewbieWantsToMaster

0

В дополнение к отклику MHomer я просто хотел добавить, что основная часть моей проблемы приходила, потому что я пытался выполнять некоторые математические операции над объектами, которые я пытался сохранить в Parse. Итак, я также решил, что могу создать массив, сохранить мои объекты внутри этого массива, а затем получить доступ к ключу и обновить значения. Вот пример кода того, что я использую прямо сейчас. Он выполняет некоторую математическую операцию на двух разных объектах, сохраненных в Parse, и обновляет текст метки на экране. Для доступа к двум объектам в Parse и их обновлению я использую массив.

Надеюсь, что ответы здесь помогут кому-то в будущем, так как теперь мне помогают удивительные люди StackOverFlow. Мир!

var hhhh : [Int] = [] 
@IBOutlet weak var jPercent: UILabel! 

@IBOutlet weak var yPercent: UILabel! 

override func viewDidLoad() { 
    super.viewDidLoad() 

    var query = PFQuery(className: "Count") 
    if cccc == 1 { 
     query.getObjectInBackgroundWithId("DcU9tdRdnl", block: { (object: PFObject?, error: NSError?) -> Void in 
      if error != nil { 
       print(error) 
      } else if let jCount = object { 
       jCount["count"] = jCount["count"] as! Int + 1 
       jCount.saveInBackground() 

      } 
     }) 
    } else if cccc == 2 { 
     query.getObjectInBackgroundWithId("5Bq4HJbFa3", block: { (object: PFObject?, error: NSError?) -> Void in 
      if error != nil { 
       print(error) 
      } else if let yCount = object { 
       yCount["count"] = yCount["count"] as! Int + 1 
       yCount.saveInBackground() 
      } 
     }) 
    } 

    //shouldn't use same query for findObjectsInBackgroundWithBlock and getObjectInBackgroundWithId otherwise you'll get a runtime error 
    var query2 = PFQuery(className: "Count") 
    query2.findObjectsInBackgroundWithBlock { (objects, error) -> Void in 
     if let users = objects { 
      for object in users { 
       if let user = object["count"] as? Int { 
        self.hhhh.append(user) 
       } 

      } 

     } 
     var gggg = 100*Float(self.hhhh[0])/(Float(self.hhhh[0]+self.hhhh[1])) 
     self.yPercent.text = String(format: "%.1f", gggg) + "%" 
     self.jPercent.text = String(format: "%.1f", 100 - gggg) + "%" 
     print(self.hhhh[0]) 
    } 
} 
Смежные вопросы