Как поделиться результатами в Swift ViewController, нужен ли мне делегат? - PullRequest
0 голосов
/ 06 февраля 2020

Я пытаюсь сделать приложение 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
    }
}```
...