Получить данные JSON и отобразить в виде таблицы Xcode - PullRequest
0 голосов
/ 06 октября 2018

Я создаю программу IOS для загрузки данных JSON из URL-адреса и отображения в виде таблицы IOS.У меня есть проблема, чтобы загрузить JSON (каждые 10 секунд) в контроллере просмотра страницы входа в систему и анализировать данные JSON в контроллер просмотра таблицы.Прежде чем опубликовать это, я пытался искать много раз, но не могу найти решение.Ниже StoryBoad и код

Story Board

  1. Пользователь войдет в систему, после успешного входа в систему будут загружены данные JSON (userlogin = true),Ниже код в классе входа в систему loginPage: UIViewController

    @IBOutlet weak var usernameLogin: UITextField!
    
    @IBOutlet weak var passwordLogin: UITextField!
    
    @IBAction func loginPress(_ sender: Any) {
    
        username = usernameLogin.text!
        password = passwordLogin.text!
        let request = NSMutableURLRequest(url: NSURL(string: "http://talectric.com/wp-admin/a_p/users/userlogin.php")! as URL)
        request.httpMethod = "POST"
        let postString = "username=\(username)&password=\(password)"
        request.httpBody = postString.data(using: String.Encoding.utf8)
        let task = URLSession.shared.dataTask(with: request as URLRequest) {
        data, response, error in
            if error != nil {
                print("error=\(error!)")
                return
            }
            else
            {
                do {
                    let respondString = try JSONSerialization.jsonObject(with: data!, options: []) as? NSDictionary
                    print(respondString!)
                    let message = respondString?["message"] as! String
                    if message == "Check Pass" {
                        userlogin = true
                        DispatchQueue.main.async {
                            let TabViewPageController = self.storyboard?.instantiateViewController(withIdentifier: "TabViewPageID") as! TabViewPage
                            self.present(TabViewPageController, animated: true, completion: nil)
                        }
                    }
                    else {
                        DispatchQueue.main.async {
                        let alertController = UIAlertController(title: "Login", message:
                            "Username or Password is not correct", preferredStyle: UIAlertController.Style.alert)
                        alertController.addAction(UIAlertAction(title: "OK", style: UIAlertAction.Style.default,handler: nil))
                        self.present(alertController, animated: true, completion: nil)
                        }
                    }
                }
                catch let error as NSError {
                   print(error.debugDescription)
                }
            }
        }
        task.resume()
    }
    
  2. после userlogin = true, @objc func taskdo () загрузит данные JSON в nodeidArray, но при второй загрузке не будет перезаписан первый элемент nodeidArray иnodeidArray вставляется после последнего элемента (я просто хочу перезаписать nodeidArray)

    import UIKit
    
    var timer = Timer()
    
    var userlogin = false
    
    struct Data {}
    
    var username = String()
    
    var password = String()
    
    class loginPage: UIViewController{
    
        var nodeidArray = [String]()
        override func viewDidLoad() {
            super.viewDidLoad()
            timerstart()
        }
        func timerstart()
        {
            timer = Timer.scheduledTimer(timeInterval: 5, target: self,selector: #selector(loginPage.taskdo),userInfo:nil,repeats: true)
        }
        @objc func taskdo()
        {
            if userlogin == true{
                let request = NSMutableURLRequest(url: NSURL(string: "http://talectric.com/wp-admin/a_p/iot/read_all.php")! as URL)
                request.httpMethod = "POST"
                let postString = "username=\(username)&password=\(password)&authen=wdwfesf9329140dsvfxkciospdkm"
                request.httpBody = postString.data(using: String.Encoding.utf8)
                let task = URLSession.shared.dataTask(with: request as URLRequest) {
                    data, response, error in
                    if error != nil {
                        print("error=\(error!)")
                        return
                    }
                    else
                    {
                        do {
                            if let respondString = try JSONSerialization.jsonObject(with: data!, options: .allowFragments) as? NSDictionary {
                                if let nodedata = respondString.value(forKey: "nodedata") as? NSArray {
                                    for node in nodedata{
                                        if let nodeDict = node as? NSDictionary {
                                            if let nodeid = nodeDict.value(forKey: "nodeid"){
                                                self.nodeidArray.insert(nodeid as! String, at: 0)
                                            }
                                        }
                                    }                             
                                }
                            }
                         //   print(respondString!)
                            //let message = respondString?["numberofnodeid"] as! Int
                            //let nodedata = respondString!.value(forKey: "nodedata")//
                           // let nodeid = (nodedata as AnyObject).value(forKey: "nodeid")
                          //  print(respondString!.value(forKey: "nodedata")!)                        
                            print(self.nodeidArray)
                            let defaults = UserDefaults.standard
                            defaults.set(self.nodeidArray, forKey: "YourKey")
                        }
                        catch let error as NSError {
                            print(error.debugDescription)
                        }                 
                    }
                }
                task.resume()
            }
        }
    }
    
  3. После загрузки JSON в LoginViewController я не могу вставить данные в контроллер табличного представления.Я пытаюсь изменить nodeidArray на static в LoginPage, но не могу использовать статическую переменную в @objc func taskdo ().Я также пробую UserDefaults, но не могу получить данные в TableViewController (NodeDataPage)

У меня есть успешный тест просмотра таблицы с локальной переменной в классе NodeDataPage, но я не могу проверить переменную из другого viewcontroller

import UIKit

class NodeDataPage: 
UIViewController,UITableViewDelegate,UITableViewDataSource {

    //var nodeidname = ["nodeid1","nodeid2","nodeid3"]
    var testArray : [String]() = UserDefaults.standard.objectForKey("YourKey") {
        var nodeidname : [NSString] = testArray! as! [NSString]
        println(readArray)
    }
    @IBOutlet weak var tableView: UITableView!
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return nodeidname.count
    }
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier:"nodeCell",for: indexPath)
        cell.textLabel?.text = nodeidname[indexPath.row]
        return cell
    }}

Я задаю вопросы:

  1. Как я могу перенести данные JSON (скачать в VC LoginPage) в VC табличного просмотра (VC NodeDataPage)?
  2. Как я могузапускать функцию загрузки JSON в LoginPage VC также каждые 10 секунд с вопросом 1 (я пробую статическую переменную, чтобы перейти в другое представление и не могу запустить в @objc func taskdo ()?
  3. Я хочу запускать данные загрузки JSON каждыеЧерез 10 секунд после userlogin. Должен ли я поместить эту функцию в LoginPage VC или в другое представление, потому что мне нужно постоянно получать данные с сервера?
  4. Как запустить функцию загрузки JSON, когда приложение скрыто (не уничтожено)?

Я пытался исследовать небольшую часть, но теперь она стала более сложной. Пожалуйста, помогите мне.

Спасибо

1 Ответ

0 голосов
/ 06 октября 2018

Создайте отдельный класс, такой как «DataManager», который хранит все ваши данные (nodeidArray), а также делает запросы к серверу для выборки из веб-службы каждые 10 секунд.

После успешного входа пользователя отобразите NodeDataPage,В viewDidLoad этого класса создайте объект DataManager и вызовите метод, который обрабатывает таймер и извлекает данные с сервера.

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

Надеюсь, я смогу ответить на ваши вопросы.

...