2016-05-25 1 views
0

Итак, я извлекаю данные из URL-адреса, который находится в формате json. Я пытаюсь отобразить данные в моем представлении таблицы, но, хотя это кажется простым, я не могу понять, как это сделать.Как заполнить мой tableview с помощью mutablearray от json

class CompanyModel { 

func getJSON() { 

    let companyArray: NSMutableArray = NSMutableArray() 

    let requestURL: NSURL = NSURL(string: "http://localhost/Companies/JSON.php")! 
    let urlRequest: NSMutableURLRequest = NSMutableURLRequest(URL: requestURL) 
    let session = NSURLSession.sharedSession() 
    let task = session.dataTaskWithRequest(urlRequest) { 
     (data, response, error) -> Void in 

     let httpResponse = response as! NSHTTPURLResponse 
     let statusCode = httpResponse.statusCode 

     if (statusCode == 200) { 
      print("Everyone is fine, file downloaded successfully.") 

      do{ 

       let json = try NSJSONSerialization.JSONObjectWithData(data!, options:.AllowFragments) 



       if let companies = json["companies"] as? [[String: AnyObject]] { 

        for company in companies { 

         if let name = company["name"] as? String, 
          let phoneNumber = company["phone_number"] as? String, 
          let website = company["website"] as? String, 
          let email = company["email"] as? String, 
          let address = company["address"] as? String 

         { 
         let company = CompanyModel() 

          company.name = name 
          company.phoneNumber = phoneNumber 
          company.website = website 
          company.email = email 
          company.address = address 
         } 
         companyArray.addObject(company) 
         print(companyArray) 
        } 
       } 
      } catch { 
       print("Error with Json: \(error)") 
      } 

     } 
     print(companyArray) <- array is populated 
    } 
    print(companyArray) <- array is empty 
    task.resume() 
} 
} 

Я знаю, что я сделал это раньше .... Я предполагаю, что в viewDidLoad() я бы назвал CompanyModel().getJSON(), который будет получать данные, а затем сохранить его в пустом массиве, но мой ум чувствует себя пустым, как на сделать это.

Я не могу объявить переменную NSarray и сохранить данные этой переменной непосредственно для меня, чтобы заполнить таблицу. Тем не менее, я надеюсь, что это объясняет, что я пытаюсь добиться.

ответ

0

Ну первое изменение функции, чтобы вернуть массив компании:

func getJSON() -> NSMutableArray { 

} 

К концу для цикла Возврат массива компания

for company in companies { 

} 

После того, как ваш массив заполняется, возвращает массив внутри этот блок:

dispatch_async(dispatch_get_main_queue(), { 

    return companyArray 

}) 

И после task.resume() возвращение arr ау:

return companyArray 

В любом месте вы хотите назвать этот класс и получить массив:

Получить ссылку класса

Let companyModal = CompanyModel() 

И в любом месте у вас есть вид таблицы и класс давайте скажем, в viewDidLoad, вы должны сначала иметь NSMutableArray.

var arraySource = NSMutableArray() 

И в viewDidLoad:

arraySource = companyModal.getJSON() 

И показать данные в Tableview сделать:

Mytableview.reloadData() 
+0

Именно то, что я был после, но по какой-то причине моего 'вар arraySource = NSMutableArray()' пусто. Если я делаю 'print (companyArray)' внутри той же скобки, что и 'task.resume()', то 'companyArray' пуст. Тем не менее, если я печатаю один кронштейн раньше, он по какой-то причине печатает полный массив. не уверен, почему массив удален – luke

+0

@luke попытается определить ваш массив после func getJSON: 'let companyArray: NSMutableArray = NSMutableArray()' это я думаю, потому что ваш массив определен в этих конкретных скобках, поэтому после выполнения, когда компилятор завершит этот блок , он удаляет весь массив из памяти! – AaoIi

+0

Я на самом деле уже сделал в своем коде - только что отредактировал вопрос (я думаю, это то, что вы имеете в виду). Я также добавил, что оператор печати делает и не работает. – luke

0

Вы не можете использовать return в закрытии запроса асинхронной сети, вы вместо этого нужно использовать обратный вызов.

Вам нужен NSMutableArray из запроса, поэтому первое, давайте сделаем функцию обратного вызова для этого:

completion: (array: NSMutableArray)->() 

Мы добавляем этот обратный вызов метода подписи:

func getJSON(completion: (array: NSMutableArray)->()) 

А потом на где будет располагаться массив, мы разместим этот обработчик завершения:

class CompanyModel { 
    func getJSON(completion: (array: NSMutableArray)->()) { 
     let companyArray: NSMutableArray = NSMutableArray() 
     let requestURL: NSURL = NSURL(string: "http://localhost/Companies/JSON.php")! 
     let urlRequest: NSMutableURLRequest = NSMutableURLRequest(URL: requestURL) 
     let session = NSURLSession.sharedSession() 
     let task = session.dataTaskWithRequest(urlRequest) { 
      (data, response, error) -> Void in 
      let httpResponse = response as! NSHTTPURLResponse 
      let statusCode = httpResponse.statusCode 
      if (statusCode == 200) { 
       do{ 
        let json = try NSJSONSerialization.JSONObjectWithData(data!, options:.AllowFragments) 
        if let companies = json["companies"] as? [[String: AnyObject]] { 
         for company in companies { 
          if let name = company["name"] as? String, 
           let phoneNumber = company["phone_number"] as? String, 
           let website = company["website"] as? String, 
           let email = company["email"] as? String, 
           let address = company["address"] as? String { 
           let company = CompanyModel() 
           company.name = name 
           company.phoneNumber = phoneNumber 
           company.website = website 
           company.email = email 
           company.address = address 
           companyArray.addObject(company) 
          } 
         } 

         // CALLBACK HERE 
         completion(array: companyArray) 

        } 
       } catch { 
        print("Error with Json: \(error)") 
       } 
      } 
     } 
     task.resume() 
    } 
} 

Теперь, чтобы получить массив из сети мы используем замыкание косого так:

getJSON { (array) in 
    print(array) 
} 
Смежные вопросы