2016-01-15 27 views
0
//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類中更改屬性,所以該視圖可以加載。如果視圖加載比請求更快,我無法顯示我需要的患者信息。我想觀察一個值何時被改變,並加載視圖

回答

0

你有很多選擇:

  1. 商店一個委託(!弱)對象到ViewController,這樣當你的病人完成後,你可以加載視圖。與此同時,在視圖中顯示一些合理的東西。

  2. 發送一個NSNotification,ViewController是一個監聽器。

  3. KVO(它的解釋here,只需搜索'鍵值觀察'),這將需要您的Patient對象擴展NSObject,以便您可以利用objc的KVO。

希望幫助!

+0

你能不能給我,請我試了很長一段時間的例子! – Cristian

0

您可以在變量添加一個觀察者這樣說:

var yourVariable:String!{ 
    didSet{ 
     refreshView() 
    } 
} 
相關問題