我想观察一个值何时被更改,并加载视图

时间:2016-01-15 08:30:00

标签: 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)
    }
}

问题是视图加载fester而不是请求,我需要观察我的Patient类中的属性何时更改,因此可以加载视图。如果视图加载速度超过请求,我就无法显示我需要的患者信息。

2 个答案:

答案 0 :(得分:0)

你有很多选择:

  1. 将委托(弱!)对象存储到ViewController,以便在患者完成后,您可以加载视图。与此同时,在视图中显示一些合理的东西。

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

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

    < / LI>

    希望有所帮助!

答案 1 :(得分:0)

您可以通过以下方式在变量上添加观察者:

  def new
  end

  def edit
  end

  def create
    if @client.save
      redirect_to @client, notice: t_notice('controllers.successfully_created', Client)
    else
      render action: "new"
    end
  end

  def update
    if @client.update_attributes(params[:client])
      redirect_to @client, notice: t_notice('controllers.successfully_updated', Client)
    else
      render action: "edit"
    end
  end