Как получить значение JSON из Alarmofire и всплывающее окно в табличном формате? - PullRequest
0 голосов
/ 04 февраля 2019

Я хочу получить значение из API в swift и отобразить ответ в Controller.Я создал таблицу, и я получаю ответ от API, используя Alarmofire.Мой вопрос: как использовать успешный ответ Alarmofire и отображать его в массиве.Мой код здесь:

 class NotificationHistory : UIViewController, UITableViewDelegate,UITableViewDataSource {

let urlStringChecking = "http://www.XXXXXXXX.com/uhf/getnotification.php"

func GetNotificationHistory(completionHandler: @escaping (AnyObject?, NSError?) -> ()) {
    getNotifiction(completionHandler: completionHandler)
}

func getNotifiction(completionHandler: @escaping (AnyObject?, NSError?) -> ()){
    Alamofire.request(urlStringChecking,method: .get)
        .responseJSON{ response in
        switch response.result{
        case .success:
            let list = response.result.value;
            completionHandler(list as AnyObject, nil)
        case .failure( _):
            print(response.result.error as Any)
        }
    }
}


let list = self.GetNotificationHistory(); // If I get success list here then my problem is solved but I am getting an error.

ОШИБКА: Значение типа '(NotificationHistory) -> () -> (NotificationHistory)' не имеет списка участников '

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return(list.count)
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

    let reuseIdentifier = "NotificationCell"
    var cell:UITableViewCell? = tableView.dequeueReusableCell(withIdentifier: reuseIdentifier) as UITableViewCell?
    if (cell == nil) {
        cell = UITableViewCell(style: UITableViewCellStyle.subtitle, reuseIdentifier: reuseIdentifier)
    }
    cell?.textLabel?.numberOfLines = 0
    cell!.textLabel?.text = list[indexPath.row]
    cell!.detailTextLabel?.text = list[indexPath.row]
    return cell!
}


override func viewDidLoad(){
    super.viewDidLoad()
    print("Notification History Loaded")
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
}
 }

Яочень новый для Swift.Спасибо

Ответы [ 2 ]

0 голосов
/ 04 февраля 2019

Для обработки данных json используйте SwiftyJSON установите эту стороннюю библиотеку, используя cocoapods

Сначала объявите ваш list как переменную внутри NotificationHistory класса как

var list = [[String: AnyObject]]()

Добавитьэтот код для вашего обработчика завершения getNotifiction теперь ваш код выглядит следующим образом

func getNotifiction(completionHandler: @escaping (AnyObject?, NSError?) -> ()){
        Alamofire.request(urlStringChecking,method: .get)
            .responseJSON{ response in
                switch response.result{
                case .success:
                    if ((response.result.value) != nil){
                        let jsonData = JSON(response.result.value!)

                        if let mydata = jsonData["list"].arrayObject {
                            self.list = mydata as! [[String: AnyObject]]
                        }
                        self.tableView.reloadData()

                        completionHandler(self.list, nil) 
                    }
                case .failure( _):
                    print(response.result.error as Any)
                }
        }
    }

И для вызова этой функции напишите self.GetNotificationHistory() внутри вашего viewDidLoad()

На этот раз у нас есть правильные данныев переменной list, теперь пришло время реализовать новый код в tableview

Здесь не нужно изменять

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return list.count
}

Нужны некоторые изменения в вашем коде

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

    let reuseIdentifier = "NotificationCell"

    let newListValue = list[indexPath.row] // assign new values in diff variable

    var cell:UITableViewCell? = tableView.dequeueReusableCell(withIdentifier: reuseIdentifier) as UITableViewCell?
    if (cell == nil) {
        cell = UITableViewCell(style: UITableViewCellStyle.subtitle, reuseIdentifier: reuseIdentifier)
    }
    cell?.textLabel?.numberOfLines = 0
    cell!.textLabel?.text = newListValue[indexPath.row] as? String
    cell!.detailTextLabel?.text = newListValue[indexPath.row] as? String
    return cell!
}

response.result.value содержит простой массив для обработки его как JSON, мы можем использовать его как

response.result.value as? [[String:String]]

или использовать SwiftyJSON

: D

0 голосов
/ 04 февраля 2019

Вы не можете сделать это:

let list = self.GetNotificationHistory();

GetNotificationHistory делает асинхронный запрос и ничего не возвращает.Вы должны установить list на ваше значение, когда получите ответ от сервера, а затем перезагрузите tableView.

Если список должен представлять собой массив строк, замените let list = self.GetNotificationHistory() на:

var list = String

Измените метод getNotification на:

func getNotifiction(completionHandler: @escaping ([String]?, NSError?) -> ()){
    Alamofire.request(urlStringChecking,method: .get)
        .responseJSON{ response in
        switch response.result{
        case .success:
            if let list = response.result.value as? [String] {
               self.list = list
            }
            self.tableView.reloadData()
            completionHandler(self.list, nil)
        case .failure( _):
            print(response.result.error as Any)
        }
    }
}

И затем вызовите self.GetNotificationHistory() в вашем viewDidLoad.

...