从 Web 服务器传递数据并将其显示在视图控制器上

发布于 2025-01-17 19:43:07 字数 2392 浏览 2 评论 0原文

我有来自服务器的数据,需要在另一个视图控制器上显示。 注意我执行了邮政请求。 note 我有2个viewControllers

这些字段:

firstName

lastName

emailAddress

mobilenumber

这是启动Web服务帖子(数据下载)的代码,

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    guard let profileVC = segue.destination as? ProfileViewController else {return}
    profileVC.nameLabel.text = self.firstName
    profileVC.idNumberLabel.text = self.idNumber
    profileVC.emailAddressLabel.text = self.emailAddress
    profileVC.mobileNumberLabel.text = self.mobileNumber

这是下载的数据应该在这里显示

private func updateUI(firstName: String, lastName: String, emailAddress: String, mobileNumber: String) {
    self.nameLabel.text = firstName + "" + lastName
    self.idNumberLabel.text = idNumber
    self.emailAddressLabel.text = emailAddress
       
}

这是发布请求代码

// Prepare URL
let url = URL(string: stringURL)
guard let requestUrl = url else { fatalError() }

// Prepare URL Request Object
var request = URLRequest(url: requestUrl)
request.httpMethod = "POST"

// Set HTTP Request header
request.setValue("application/json", forHTTPHeaderField: "Content-Type")
request.setValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Content-Type")
request.setValue("1088", forHTTPHeaderField: "Content-Length")

// HTTP Parameters which will be sent in HTTP Request body
let postString = "userID=\(useridTextField.text)&password=\(passwordTextField.text)";

// Set HTTP Request Body
request.httpBody = postString.data(using: String.Encoding.utf8)

// Perform HTTP Request
let session = URLSession.shared
let task = session.dataTask(with: request) { data, response, error in
    
    guard let data = data else {
        return
    }
    
    do {
        var response = try JSONDecoder().decode(User.self, from: data)
        response.idNumber = self.idNumber
        response.firstName = self.firstName
        response.middleName = self.middleName
        response.lastName = self.lastName
        response.emailAddress = self.emailAddress
        response.mobileNumber = self.mobileNumber
        response.landline = self.landline
        
        
        return
    } catch {
        let str = String(decoding: data, as: UTF8.self)
        print(str)
        
    }
    
}
task.resume()

I have data from a server which I need to show on another View Controller.
Note I had perform a POST request.
Note I have 2 ViewControllers

these are the fields:

firstName

lastName

emailAddress

mobileNumber

This is the code that started the web service POST (data downloaded)

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    guard let profileVC = segue.destination as? ProfileViewController else {return}
    profileVC.nameLabel.text = self.firstName
    profileVC.idNumberLabel.text = self.idNumber
    profileVC.emailAddressLabel.text = self.emailAddress
    profileVC.mobileNumberLabel.text = self.mobileNumber

This is where the downloaded data is supposed to show

private func updateUI(firstName: String, lastName: String, emailAddress: String, mobileNumber: String) {
    self.nameLabel.text = firstName + "" + lastName
    self.idNumberLabel.text = idNumber
    self.emailAddressLabel.text = emailAddress
       
}

this is the post request code

// Prepare URL
let url = URL(string: stringURL)
guard let requestUrl = url else { fatalError() }

// Prepare URL Request Object
var request = URLRequest(url: requestUrl)
request.httpMethod = "POST"

// Set HTTP Request header
request.setValue("application/json", forHTTPHeaderField: "Content-Type")
request.setValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Content-Type")
request.setValue("1088", forHTTPHeaderField: "Content-Length")

// HTTP Parameters which will be sent in HTTP Request body
let postString = "userID=\(useridTextField.text)&password=\(passwordTextField.text)";

// Set HTTP Request Body
request.httpBody = postString.data(using: String.Encoding.utf8)

// Perform HTTP Request
let session = URLSession.shared
let task = session.dataTask(with: request) { data, response, error in
    
    guard let data = data else {
        return
    }
    
    do {
        var response = try JSONDecoder().decode(User.self, from: data)
        response.idNumber = self.idNumber
        response.firstName = self.firstName
        response.middleName = self.middleName
        response.lastName = self.lastName
        response.emailAddress = self.emailAddress
        response.mobileNumber = self.mobileNumber
        response.landline = self.landline
        
        
        return
    } catch {
        let str = String(decoding: data, as: UTF8.self)
        print(str)
        
    }
    
}
task.resume()

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

软甜啾 2025-01-24 19:43:07

下面是一个使用 Publish/Observer 模式和 Notifications 的示例

我从这个简单的扩展开始,它可以帮助我组织通知名称

extension Notification.Name {

    static let DidLoginSuccessfully
        = Notification.Name("DidLoginSuccessfully")
}

假设您有一个带有启动请求函数的 Network 类,可以启动您的网络请求。

一旦你成功获得响应并解码了对 URL 对象的响应,你就可以向任何观察者发布/发布通知

fileprivate func launchRequest() {
    
    // Prepare URL
    let url = URL(string: stringURL)
    guard let requestUrl = url else { fatalError() }

    // Prepare URL Request Object
    var request = URLRequest(url: requestUrl)
    request.httpMethod = "POST"

    // Set HTTP Request header
    request.setValue("application/json", forHTTPHeaderField: "Content-Type")
    request.setValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Content-Type")
    request.setValue("1088", forHTTPHeaderField: "Content-Length")

    // HTTP Parameters which will be sent in HTTP Request body
    let postString = "userID=\(useridTextField.text)&password=\(passwordTextField.text)";

    // Set HTTP Request Body
    request.httpBody = postString.data(using: String.Encoding.utf8)

    // Perform HTTP Request
    let session = URLSession.shared
    let task = session.dataTask(with: request) { data, response, error in
        
        guard let data = data else {
            return
        }
        
        do {
            // Change response variable name to user
            var user = try JSONDecoder().decode(User.self, from: data)
            user.idNumber = self.idNumber
            user.firstName = self.firstName
            user.middleName = self.middleName
            user.lastName = self.lastName
            user.emailAddress = self.emailAddress
            user.mobileNumber = self.mobileNumber
            user.landline = self.landline
            
            // Publish the notification
            NotificationCenter.default.post(name: .DidLoginSuccessfully,
                                            object: user)
            
            
        } catch {
            let str = String(decoding: data, as: UTF8.self)
            print(str)
            
        }
    }
    
    task.resume()
}

然后在需要更新一些数据的模块中,你需要观察/监听这个通知

例如,假设这是一个视图控制器,您需要观察此通知,当您收到此事件的通知时,您需要对其进行管理。

class SomeCustomVC: UIViewController {
    
    override func viewDidLoad() {
        super.viewDidLoad()
        subscribeToNotifications()
    }
    
    deinit {
        unsubscribeFromNotifications()
    }
    
    
    private func subscribeToNotifications() {
        
        // Sets the view controller to list to this notification
        NotificationCenter.default.addObserver(self,
                                               selector: #selector(didLoginSuccessfully(_:)),
                                               name: .DidLoginSuccessfully,
                                               object: nil)
    }
    
    // Your button login event handler
    private func didTapLoginButton() {
        // Make the segue or API request as you do
    }
    
    private func unsubscribeFromNotifications() {
        NotificationCenter.default.removeObserver(self,
                                                  name: .DidLoginSuccessfully,
                                                  object: nil)
    }
    
    // Your update UI function
    private func updateUI(firstName: String,
                          lastName: String,
                          emailAddress: String,
                          mobileNumber: String) {
        self.nameLabel.text = firstName + "" + lastName
        self.idNumberLabel.text = idNumber
        self.emailAddressLabel.text = emailAddress
    }
}

// Notification Observer
extension SomeCustomVC {
    
    @objc func didLoginSuccessfully(_ notification: Notification) {
        
        if let user = notification.object as? User {
            
            updateUI(firstName: user.firstName,
                     lastName: user.lastName,
                     emailAddress: user.emailAddress,
                     mobileNumber: user.mobileNumber)
            
        }
    }
}

尝试一下,看看是否对您有帮助。

如果您正在寻找更复杂的东西,例如绑定,您可以看看这个 结合教程

Here is an example using Publish/Observer pattern with Notifications

I start with this simple extension that helps me organize notification names

extension Notification.Name {

    static let DidLoginSuccessfully
        = Notification.Name("DidLoginSuccessfully")
}

Let's say you have a Network class with a launch request function that launches your network request.

Once you have successfully got a response and decoded your response to a URL object, you can publish / post a notification to any observers

fileprivate func launchRequest() {
    
    // Prepare URL
    let url = URL(string: stringURL)
    guard let requestUrl = url else { fatalError() }

    // Prepare URL Request Object
    var request = URLRequest(url: requestUrl)
    request.httpMethod = "POST"

    // Set HTTP Request header
    request.setValue("application/json", forHTTPHeaderField: "Content-Type")
    request.setValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Content-Type")
    request.setValue("1088", forHTTPHeaderField: "Content-Length")

    // HTTP Parameters which will be sent in HTTP Request body
    let postString = "userID=\(useridTextField.text)&password=\(passwordTextField.text)";

    // Set HTTP Request Body
    request.httpBody = postString.data(using: String.Encoding.utf8)

    // Perform HTTP Request
    let session = URLSession.shared
    let task = session.dataTask(with: request) { data, response, error in
        
        guard let data = data else {
            return
        }
        
        do {
            // Change response variable name to user
            var user = try JSONDecoder().decode(User.self, from: data)
            user.idNumber = self.idNumber
            user.firstName = self.firstName
            user.middleName = self.middleName
            user.lastName = self.lastName
            user.emailAddress = self.emailAddress
            user.mobileNumber = self.mobileNumber
            user.landline = self.landline
            
            // Publish the notification
            NotificationCenter.default.post(name: .DidLoginSuccessfully,
                                            object: user)
            
            
        } catch {
            let str = String(decoding: data, as: UTF8.self)
            print(str)
            
        }
    }
    
    task.resume()
}

Then in the module where you need some data to be updated, you need to observe / listen this notification

For example, let's say this was a view controller, you need to observe this notification and when you get notified of this event, you need to manage this.

class SomeCustomVC: UIViewController {
    
    override func viewDidLoad() {
        super.viewDidLoad()
        subscribeToNotifications()
    }
    
    deinit {
        unsubscribeFromNotifications()
    }
    
    
    private func subscribeToNotifications() {
        
        // Sets the view controller to list to this notification
        NotificationCenter.default.addObserver(self,
                                               selector: #selector(didLoginSuccessfully(_:)),
                                               name: .DidLoginSuccessfully,
                                               object: nil)
    }
    
    // Your button login event handler
    private func didTapLoginButton() {
        // Make the segue or API request as you do
    }
    
    private func unsubscribeFromNotifications() {
        NotificationCenter.default.removeObserver(self,
                                                  name: .DidLoginSuccessfully,
                                                  object: nil)
    }
    
    // Your update UI function
    private func updateUI(firstName: String,
                          lastName: String,
                          emailAddress: String,
                          mobileNumber: String) {
        self.nameLabel.text = firstName + "" + lastName
        self.idNumberLabel.text = idNumber
        self.emailAddressLabel.text = emailAddress
    }
}

// Notification Observer
extension SomeCustomVC {
    
    @objc func didLoginSuccessfully(_ notification: Notification) {
        
        if let user = notification.object as? User {
            
            updateUI(firstName: user.firstName,
                     lastName: user.lastName,
                     emailAddress: user.emailAddress,
                     mobileNumber: user.mobileNumber)
            
        }
    }
}

Give this a go and see if it helps you.

If you are looking for something more sophisticated like binding, you can have a look at this Combine tutorial.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文