2016-01-09 5 views
1

Проблема, с которой я сталкиваюсь, заключается в том, что я не могу заполнить пустой массив данными JSON и не могу найти аналогичную проблему, заданную в StackOverflow.Swift Array не будет заполняться данными JSON

Внутри самой функции я могу получить пустой массив и заполнить массив внутри функции. Затем вызовите функцию печати в функции downloadRestaurantDetails, чтобы просмотреть информацию, которую я проанализировал.

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

import UIKit 
import GoogleMaps 
import Alamofire 
import SwiftyJSON 

class ViewController: UIViewController { 

var placeIDArray = [String]() 
var placeID: String! 

override func viewDidLoad() { 
    super.viewDidLoad() 

    downloadRestaurantDetails {() ->() in 

    } 
} 

override func didReceiveMemoryWarning() { 
    super.didReceiveMemoryWarning() 
    // Dispose of any resources that can be recreated. 
} 


func downloadRestaurantDetails(completed: DownloadComplete) { 
    //url is acquired through a file created for global variables 
    Alamofire.request(.GET,url).responseJSON { (response) -> Void in 
     if let value = response.result.value { 
      let json = JSON(value) 

      //Acquire All place_id of restaurants 
      if let results = json["results"].array { 
       for result in results { 
        if let allPlace_ID = result["place_id"].string { 
         //Add All place_id's into an array 
         self.placeIDArray.append(allPlace_ID) 
        } 

       } 
      } 
     } 

    // i call this method to check and see if there is anything placed in the array outside of the downloadRestaurantDetails method. 

    func check() { 
    if self.placeIDArray.count > 1 { 
     print(self.placeIDArray) 

    } else { 
     print(self.placeIDArray.count) 
    } 
} 

В заключение, вопрос, который я хотел бы решить,

  • Я хотел бы разобрать place_id и поместить полученные строки в placeIDArray. Я могу анализировать данные и хранить значения внутри объекта IDArray внутри функции. Я не могу хранить анализируемые данные в пустом массиве вне функции. Я думал, что с помощью self.placeIDArray проанализированные данные будут назначены массиву. но, похоже, это не так.
+0

еще смутившись от этого, у любого есть идеал стоит? – lifewithelliott

+0

Где вы пытаетесь получить доступ к значению 'placeIDArray', когда вы проверяете, назначены ли ему данные? – DMan

+0

я создал функцию, чтобы проверить, чтобы увидеть, если я могу получить доступ к данным в массиве и распечатать его на экране отладки , и это дает мне кол 0 однако, когда я напечатать его в функции сразу же после того, как я .placeIDArray.append (allPlace_ID), тогда все элементы печатаются правильно, как я хочу их. так что я оставляю меня, чтобы предположить, что элементы не назначены вне функции. если это правильная логика? – lifewithelliott

ответ

1

downloadRestaurantDetails является асинхронным. Поэтому, если вы вызываете check сразу после вызова вышеуказанной функции, тогда возможно (и очень вероятно), что JSON еще не получен, и поэтому placeIDArray еще не был заполнен. Вы должны вызвать его в обратном вызове, потому что именно тогда данные действительно были загружены и заполнены в массив.

Итак:

  1. Добавить обратный вызов после того, как данные были установлены:

    func downloadRestaurantDetails(completed: DownloadComplete) { 
        //url is acquired through a file created for global variables 
        Alamofire.request(.GET,url).responseJSON { (response) -> Void in 
         if let value = response.result.value { 
          let json = JSON(value) 
    
          //Acquire All place_id of restaurants 
          if let results = json["results"].array { 
           for result in results { 
            if let allPlace_ID = result["place_id"].string { 
             //Add All place_id's into an array 
             self.placeIDArray.append(allPlace_ID) 
    
            } 
    
           } 
           // !!! Call the callback: 
           completed() 
          } 
    } 
    
  2. Тогда вы можете вызвать check внутри обратного вызова:

    override func viewDidLoad() { 
        super.viewDidLoad() 
    
        downloadRestaurantDetails {() ->() in 
         // The array is now filled. 
         self.check() 
        } 
    } 
    
+0

гений! Большое вам спасибо! :) весело получилось проблемы! – lifewithelliott

+0

Я переместил завершенный() вызов до 2-го, чтобы последний закрыл фигурные фигуры в функции downloadRestaurantDetails, чтобы он не зацикливал раз в два раза. но кроме этого он исправил мою проблему отлично! – lifewithelliott

+0

Хороший улов! Я отредактировал свой ответ, чтобы отразить это. – DMan