2015-12-18 2 views
2

Итак, при быстром изучении я столкнулся с проблемой добавления значений в свойство массива. Когда я пытаюсь напечатать первое значение массива после добавления к нему значения, я получаю ошибку индекса за пределами границ. Как добавить значение в свойство массива, доступное для всего класса?Swift Properties

class HomeViewController: UIViewController { 

    var geofences = [Geofence]() 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     getFences() 
     print(self.geofences[0]) 
    } 

    func getFences() { 
     var query = PFQuery(className:"Geofence") 
     query.whereKey("username", equalTo: "Peter") 
     query.findObjectsInBackgroundWithBlock { 
      (fences: [PFObject]?, error: NSError?) -> Void in 
      if error == nil && fences != nil { 
       if let fences = fences { 
        for (index, element) in fences.enumerate() { 
         var unique_id = element.objectId 
         var fence_radius = element["radius"] as! Int 
         var fence_name = element["name"] as! String 
         var lat = element["centerPoint"].latitude 
         var lon = element["centerPoint"].longitude 
         var center = CLLocationCoordinate2D(latitude: lat, longitude: lon) 
         var new_fence: Geofence? = Geofence(uniqueID: unique_id!, radius: fence_radius, centerPoint: center, name: fence_name) 
         self.geofences.append(new_fence!) 
        } 
       } 
      } else { 
       print(error) 
      } 
     } 
    } 

EDIT: Кажется, я упростил проблему. Вот код, который вызывает ошибку индекса за пределами границ. Когда я извлекаю geofence из Parse, массив geofences заполняется, но как только он выйдет из метода getFences, массив опустеет.

+3

Я не получаю индекс за пределами ошибки с этим кодом. – mn1

+3

Вы уверены, что индекс за пределами ошибки указан в коде, который вы опубликовали? – JAL

+0

Я опубликовал код, который, как я думал, был похож на мою проблему, но, похоже, это было упрощено. Я отправил точный код, с которым я работаю. – TheRunner565

ответ

3

Вероятно, что ваш вызов печати выполняется до того, как getFences() успел заполнить массив. Вы можете проверить это с помощью другого вызова печати за пределами query.findObjectsInBackgroundWithBlock

+0

Хорошо, я поставил тот же оператор печати в конце метода getFences и вне query.findObjectsInBackgroundWithBlock и произошла ошибка. После размещения точки останова в конце метода getFences и проверки self.geofences, массив опустел, я понятия не имею, почему! – TheRunner565

+1

Как полезный мысленный эксперимент, представьте, что он занимает 30 секунд до выполнения блока findObjects. Sp все, что происходит в этом ** блоке **, подобно заполнению массива геофонов, произойдет не через 30 секунд после загрузки вашего представления. Функция viewDidLoad будет выполнена, и функция getFences выполнит, но не блок. Что бы вы ожидали, что геозоны будут содержать в течение этого времени? [Пустой массив] Вы пытаетесь получить к нему доступ, когда он еще не готов? [Да] – adpalumbo

+0

Возможно, что вызов печати в конце метода все еще выполняется до нумерационного кода в findObjectsInBackgroundWithBlock. Выполнение печати (NSDate()) для сопровождения каждой попытки может дать вам знать. В любом случае вы, вероятно, можете создать новый метод для работы с данными, которые вы вызываете в конце findObjectsInBackgroundWithBlock. – mcclux