swift - 我想观察值何时更改并加载 View

标签 swift

//Patient class
import Foundation

struct Patients {
    var family: NSArray
    var given: NSArray
    var id: String
    var birthdate:String
    var gender: String
}

struct Address {
    var city: String
    var country: String
    var line: NSArray
}

class Patient  {
     var flag = 0
    var address = Address(city: "", country: "", line: [""])
    var patient_info = Patients(family: [""], given: [""], id: "", birthdate: "", gender: "")
    var response : AnyObject?


    init(response: AnyObject) {
        self.response = response


        if let entry = response.objectForKey("entry") {
            //MARK: Address
            if let resource = entry[0].objectForKey("resource") {
                if let add = resource.objectForKey("address") {
                    address.city   =  add[0].objectForKey("city")! as! String
                    address.country =  add[0].objectForKey("country")! as! String
                    address.line = add[0].objectForKey("line")! as! NSArray
                    //MARK: patient

                    patient_info.birthdate = resource.objectForKey("birthDate")! as! String
                    patient_info.gender = resource.objectForKey("gender")! as! String
                    if let  name = resource.objectForKey("name") {
                        patient_info.family = name[0].objectForKey("family")! as! NSArray
                        patient_info.given = name[0].objectForKey("given")! as! NSArray
                    }
                }
            }
            //MARK: id
            if let link = entry[0].objectForKey("link") {
                if let url = link[0].objectForKey("url") {
                    let id = url.componentsSeparatedByString("/")
                    patient_info.id = id[id.count-1]

                }
            }
        }
  print(patient_info)
    }



}

//ViewController class

import UIKit

class ViewController: UIViewController, UITextFieldDelegate {
    var viewModel = ViewModel()
    @IBOutlet weak var family_name: UITextField!
    @IBOutlet weak var given_name: UITextField!
    override func viewDidLoad() {
        super.viewDidLoad()
        family_name.delegate = self
        given_name.delegate = self

    }


    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    func textFieldShouldReturn(textField: UITextField) -> Bool {
        switch textField {

        case family_name:
            family_name.resignFirstResponder()
            given_name.becomeFirstResponder()

        case given_name:
            given_name .resignFirstResponder()

        default:
            print("")

        }

    return true

    }

    @IBAction func search(sender: UIButton) {
       let family_name1 = family_name.text!
        let given_name1 = given_name.text!
        viewModel .searchForPatient(family_name1, given_name: given_name1)
    //When the name property from my patient class changed I can call the //below method. How to implement the observer? 
  performSegueWithIdentifier("showSegue", sender:sender) 
    }

    override func prepareForSegue(segue: UIStoryboardSegue, sender:AnyObject?){
        if segue.identifier == "showPatientSegue" {
            if let displayViewController = segue.destinationViewController as? DisplayViewController {
                displayViewController.viewModelDisplay.patient = viewModel.patient

            }

        }



    }
}

// ViewModel where I make the request.
import Foundation
import Alamofire
import SystemConfiguration
class ViewModel {
    var patient = Patient!()


    func searchForPatient(family_name:  String, given_name : String) {
       let header = ["Accept" : "application/json"]
        Alamofire.request(.GET, "https://open-ic.epic.com/FHIR/api/FHIR/DSTU2/Patient?family=\(family_name)&given=\(given_name)", headers: header).responseJSON { response in
            self.patient = Patient(response: response.result.value!)

        }
    }



    func checkInternetConnection() -> Bool {

        var zeroAddress = sockaddr_in()
        zeroAddress.sin_len = UInt8(sizeofValue(zeroAddress))
        zeroAddress.sin_family = sa_family_t(AF_INET)
        let defaultRouteReachability = withUnsafePointer(&zeroAddress) {
            SCNetworkReachabilityCreateWithAddress(nil, UnsafePointer($0))
        }
        var flags = SCNetworkReachabilityFlags()
        if !SCNetworkReachabilityGetFlags(defaultRouteReachability!, &flags) {
            return false
        }
        let isReachable = (flags.rawValue & UInt32(kSCNetworkFlagsReachable)) != 0
        let needsConnection = (flags.rawValue & UInt32(kSCNetworkFlagsConnectionRequired)) != 0
        return (isReachable && !needsConnection)
    }
}

问题是 View 加载速度比请求更快,我需要观察 Patient 类中的属性何时更改,以便可以加载 View 。如果 View 加载速度快于请求,我将无法显示我需要的患者信息。

最佳答案

你有很多选择:

  1. 将委托(delegate)(弱!)对象存储到 ViewController,以便当您的患者完成时,您可以加载 View 。同时,在 View 中显示一些有意义的内容。

  2. 发送一个 NSNotification,ViewController 是它的监听器。

  3. KVO(其解释 here ,只需搜索“键值观察”),这需要您的 Patient 对象扩展 NSObject,以便您可以利用 objc 的 KVO。

希望有帮助!

关于swift - 我想观察值何时更改并加载 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34806967/

相关文章:

ios - 我正在使用 Whisper swift 库,有没有办法判断耳语是否可见?

Swift BitConverter.DoubleToInt64Bits 等效

swift - 在 ContextMenu 中更改 UIImage 的弹出窗口大小?

iOS 应用程序在 macOS Finder 中不可见

ios - 获取顶部约束的引用

ios - 如何不以编程方式处理某些通用链接?

ios - 使一个小的 UIImageView 易于被点击

ios - Swift 枚举值不可访问

swift - 如何更改文本 - swift 在 UIAlertAction 中向左对齐

ios - UINavigationControllerDelegate 破坏了 PushViewController