Я создаю программу IOS для загрузки данных JSON из URL-адреса и отображения в виде таблицы IOS.У меня есть проблема, чтобы загрузить JSON (каждые 10 секунд) в контроллере просмотра страницы входа в систему и анализировать данные JSON в контроллер просмотра таблицы.Прежде чем опубликовать это, я пытался искать много раз, но не могу найти решение.Ниже StoryBoad и код
Story Board
Пользователь войдет в систему, после успешного входа в систему будут загружены данные 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()
}
после 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()
}
}
}
После загрузки 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
}}
Я задаю вопросы:
- Как я могу перенести данные JSON (скачать в VC LoginPage) в VC табличного просмотра (VC NodeDataPage)?
- Как я могузапускать функцию загрузки JSON в LoginPage VC также каждые 10 секунд с вопросом 1 (я пробую статическую переменную, чтобы перейти в другое представление и не могу запустить в @objc func taskdo ()?
- Я хочу запускать данные загрузки JSON каждыеЧерез 10 секунд после userlogin. Должен ли я поместить эту функцию в LoginPage VC или в другое представление, потому что мне нужно постоянно получать данные с сервера?
- Как запустить функцию загрузки JSON, когда приложение скрыто (не уничтожено)?
Я пытался исследовать небольшую часть, но теперь она стала более сложной. Пожалуйста, помогите мне.
Спасибо