Я пытаюсь сделать приложение Demo Swift. Как отмечено в названии. Я застрял при попытке поделиться результатами в пользовательском интерфейсе?
Вывод кода в консоли сбивает с толку ... Он загружает данные, заполнил мой пользовательский массив ... но в GameViewController. ... кажется, что объект пуст, хотя я знаю, что он загружен ... Почему?
Может быть, я пропустил делегата или что-то еще, чтобы координировать вызов php и загрузить данные ... потому что это показывает загрузку данных после завершения вызова кнопки pu sh.
Вот вывод консоли:
Это метод пользовательского интерфейса: PerformAction
Количество пользователей: 0
END ....:
Это метод UserModel downloadItems
Загруженные данные
firstName: David
У меня есть эти классы, на которых я сосредоточен:
1) UserModel.swift,
2) UserData.swift
3) GameViewController.swift
UserData - это то, что я бы назвал базовым c объектом данных, UserId, FirstName, LastName, UserSessionID
Это код:
import Foundation
class UserData: NSObject {
//properties
var UserID : String?
var FirstName : String?
var LastName : String?
var UserSessionID : String?
//empty constructor
override init() { }
//construct with @ID, @First, @Last, and @SessionId parameters
init(UserID: String, FirstName: String, LastName: String, UserSessionID: String) {
self.UserID = UserID
self.FirstName = FirstName
self.LastName = LastName
self.UserSessionID = UserSessionID
}
//prints object's current states
override var description: String {
return "UserID: \(String(describing: UserID))"
}
}
Тогда у меня есть UserModel чтобы загрузить данные из вызова PHP и заполнить список пользователей UserData:
import Foundation
protocol UserModelProtocol: class {
func itemsDownloaded(items: NSArray)
}
class UserModel: NSObject, URLSessionDataDelegate {
//properties
weak var delegate: UserModelProtocol!
let urlPath = "http://website.com/demo.php"
//this will be changed to the path where service.php lives
public var users = [UserData]()
//empty constructor
override init() { }
func downloadItems() {
let url: URL = URL(string: urlPath)!
let defaultSession = Foundation.URLSession(configuration: URLSessionConfiguration.default)
let task = defaultSession.dataTask(with: url) {
(data, response, error) in
if error != nil {
print("Failed to download data")
}else {
print("Data downloaded")
self.parseJSON(data!)
}
}
task.resume()
}
func parseJSON(_ data:Data) {
var jsonResult: [[String: Any]]?
do {
jsonResult = try
JSONSerialization.jsonObject(with: data, options:JSONSerialization.ReadingOptions.allowFragments) as? [[String: Any]]
} catch let error as NSError {
print(error)
return
}
guard let result = jsonResult else {
return
}
for jsonElement in result {
if let UserID = jsonElement["Userid"] as? String,
let firstName = jsonElement["First_Name"] as? String,
let lastName = jsonElement["Last_Name"] as? String,
let userSessionID = jsonElement["Session_ID"] as? String
{
let user = UserData()
user.UserID = UserID
user.FirstName = firstName
user.LastName = lastName
user.UserSessionID = userSessionID
users.append(user)
}
}
if let userDataVal = users.first {
print("firstName:", userDataVal.FirstName!);
}
}
}
Затем в последний раз я надеялся опубликовать данные в UserInterface:
import UIKit
import SpriteKit
import GameplayKit
import Foundation
class GameViewController: UIViewController {
@IBOutlet weak var TextMessage: UITextView!
@IBOutlet weak var getUserInput: UITextField!
@IBAction func PerformAction(_ sender: Any) {
if getUserInput.text == "Ready" {
TextMessage.text = "OK Player"
let userModel = UserModel()
userModel.downloadItems()
if let userDataVal = userModel.users.first {
print("test....:", userDataVal.FirstName!);
TextMessage.text = userDataVal.FirstName!
}
if userModel.users.count > 0 {
print("user Count:", userModel.users.count);
} else {
print("user Count: 0");
}
for item in userModel.users {
print("test....:", item.FirstName!);
TextMessage.text = item.FirstName!;
}
print("END....:" );
}
}
private let userModel = UserModel()
override func viewDidLoad() {
super.viewDidLoad()
if let view = self.view as! SKView? {
// Load the SKScene from 'GameScene.sks'
if let scene = SKScene(fileNamed: "GameScene") {
// Set the scale mode to scale to fit the window
scene.scaleMode = .aspectFill
// Present the scene
view.presentScene(scene)
}
view.ignoresSiblingOrder = true
view.showsFPS = true
view.showsNodeCount = true
}
}
override var shouldAutorotate: Bool {
return true
}
override var supportedInterfaceOrientations: UIInterfaceOrientationMask {
if UIDevice.current.userInterfaceIdiom == .phone {
return .allButUpsideDown
} else {
return .all
}
}
override var prefersStatusBarHidden: Bool {
return true
}
}```