2016-04-09 2 views
-1

Я пытаюсь получить некоторые данные из бэкэнд, а затем назначить их на 3 разных массива. Эти массивы, которые я затем хочу использовать, чтобы заполнить мой tableViewCells. Проблема в том, что когда я печатаю свои массивы вне блока выборки, они возвращают нуль. Когда я печатаю их в блоке выборки, они возвращают переменные объекта, которые я намереваюсь сделать.Как заполнить эти массивы, чтобы затем заполнить таблицуView?

Я включаю строку self.tableView.reloadData() в надежде, что массивы будут заполнены и впоследствии будут заполнены tableViewCells, но, похоже, это не работает.

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

var capArray = [String]() 
var imageDic = [String: [PFFile]]() 
var priceArray = [Int]() 


override func viewDidAppear(animated: Bool) { 

    capArray.removeAll(keepCapacity: true) 
    imageDic.removeAll(keepCapacity: true) 
    priceArray.removeAll(keepCapacity: true) 

    let query = PFQuery(className: "SellerObject") 
    query.findObjectsInBackgroundWithBlock { (objects, error) -> Void in 

     if let objects = objects { 
      for o in objects { 

       if o.objectForKey("caption") != nil && o.objectForKey("imageFile") != nil && o.objectForKey("price") != nil { 
       let cap = o.objectForKey("caption") as? String 
        self.capArray.append(cap!) 
       let imdic = o.objectForKey("imageFile") as? [PFFile] 
       self.imageDic[cap!] = imdic 
       let price = o.objectForKey("price") as? String 
       let priceInt = Int(price!) 
       self.priceArray.append(priceInt!) 

      } 
      } 
     } 
    } 

    self.tableView.reloadData()  
} 

ответ

0

Ваша проблема self.tableView.reloadData() выполняется до того, как блок завершил выполнение.

Простейшая вещь, чтобы увидеть, что это работает, - это переместить self.tableView.reloadData() внутри блока, но это кратковременный взлом, чтобы увидеть что-то в действии.

Но это неправильный долгосрочный подход. Чтобы сделать это правильно, ваш код популяции массива должен действительно находиться в модели. Вначале ваше табличное представление загрузилось без использования данных, ваша модель уведомит ваш контроллер представления, когда данные станут доступными, и контроллер вида затем обновит таблицу.

Если данные поступают с устройства, представление таблицы может подождать до того, как оно загрузится, если данные могут быть получены быстро, если данные поступают по сети, ему нужно подождать.

+0

OK, это имеет смысл. Но теперь, когда я добавляю self.tableView.reloadData(), приложение выходит из строя со следующим сообщением об ошибке: фатальная ошибка: неожиданно найденный nil при развертывании необязательного значения –

+0

Вам нужно выяснить, откуда это происходит. Есть буквально тысячи прошлых вопросов с точно выраженной фразой «неожиданно найденный nil при разворачивании необязательного значения» в заголовке или вопросе. – Gruntcakes

+1

Проверьте эту тему: http://stackoverflow.com/questions/35683813/how-to-deal-with-fatal-error-unexpectedly-found-nil-while-unwrapping-an-option –

Смежные вопросы