2016-12-08 3 views
0

抽出したJSONデータを取得してUITableviewに表示するプロジェクトを作成しました。ダウンロードすることでアプリケーションに負担をかけたくありません私が送信した値を送信するにはどうすればいいですか?私は送信した値をどのように送信できますか?ページのdispatch_syncでページをdetailviewcontrollerするには?dispatch_sync(dispatch_get_main_queue()、{})を別のページに送信/返す方法

これはmanagePageviewController

func viewDetailViewController(index: Int) -> DetailViewController? { 
    if let storyboard = storyboard, 
     page = storyboard.instantiateViewControllerWithIdentifier("DetailViewController") as? DetailViewController {   

       let currentEmployee = employeeStore.searchEmployee[index] 

       getJson().testsearchJSON(currentEmployee.id, handler: {(employeeDetails) -> Void in 
        dispatch_sync(dispatch_get_main_queue(), { 
         page.employee = employeeDetails 
         page.employeeIndex = index 
         return page //fail here 
        }) 
       }) 
    } 
    return nil 
} 
から私のコードです

これは私のgetJSON(である)。testSearchJSON基金

func testsearchJSON(id:String, handler: (Employee) -> Void) { 
    let requestURL: NSURL = NSURL(string: (favUrl + id))! 
    let urlRequest: NSMutableURLRequest = NSMutableURLRequest(URL: requestURL) 
    let session = NSURLSession.sharedSession() 
    let task = session.dataTaskWithRequest(urlRequest) { 
     (data, response, error) -> Void in 

     let httpResponse = response as! NSHTTPURLResponse 
     let statusCode = httpResponse.statusCode 

     //retrieve data successfully 
     if (statusCode == 200) { 
      do { 
       let json = try NSJSONSerialization.JSONObjectWithData(data!, options: .AllowFragments) 
       if data!.length > 0 && error == nil { 

        guard let name = json["firstName"] as? String, 
        let title = json["title"] as? String, 
        let id = json["id"]!, 
        let manager = json["managerName"] as? String, 
        let oa = json["oa"] as? String, 
        let email = json["email"] as? String, 
        let department = json["department"] as? String, 
        let division = json["division"] as? String, 
        let company = json["company"] as? String 
        else { 
          return; 
        } 
        let newEmployee = Employee(id: String(id), name: name, title: title, manager: manager, oa: oa, email: email, department: department, division: division, company: company) 

        //test 

        handler(newEmployee) 

       } 
      } catch { 
       print("Error with JSON: \(error)") 
      } 
     } 
    } 
    task.resume() 
    } 
} 

これはDetailviewController

class DetailViewController: UIViewController, UITextFieldDelegate { 

// MARK:- Propertise 
@IBOutlet var employeePic: UIImageView! //employee picture 
@IBOutlet var employeeName: UILabel! // name 
@IBOutlet var employeeTitle: UILabel! //job title 
@IBOutlet var dateCreated: UILabel! 
@IBOutlet var managerName: UITextField! 
@IBOutlet var oaName: UITextField! 
@IBOutlet var emailField: UITextField! 
@IBOutlet var departmentField: UITextField! 
@IBOutlet var divisionField: UITextField! 
@IBOutlet var companyField: UITextField! 


var employee: Employee! { 
    //add applicataion name 
    didSet { 
     navigationItem.title = employee.name 
    } 
} 
//current employee index 
var employeeIndex: Int! 

let dateFormatter: NSDateFormatter = { 
    let formatter = NSDateFormatter() 
    formatter.dateStyle = .MediumStyle 
    formatter.timeStyle = .NoStyle 
    return formatter 
}() 

//MARK:- assign values 
override func viewWillAppear(animated: Bool) { 
    super.viewWillAppear(animated) 

    employeeName.text = employee.name 
    employeeTitle.text = "(" + employee.title + ")" 
    emailField.text = employee.email 
    managerName.text = employee.manager 
    dateCreated.text = dateFormatter.stringFromDate(employee.dateCreated) 
    oaName.text = employee.oa 
    departmentField.text = employee.department 
    divisionField.text = employee.division 
    companyField.text = employee.company 

    //retrieve image 
    employeePic.thumbnails() 
    employeePic.image = UIImage(named: "Default Image") 

} 

答えて

0

を好きにしてください、私はそれは次のようになり、この場合だと思いますDetailViewControllerのviewDidLoad関数またはviewWillAppear関数でデータフェッチを書き込むほうがよい。そのような何か:MainViewControllerで

:DetailViewControllerで

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 
    viewDetailViewController(index : indexPath.row, employee: employeeStore.searchEmployee[indexPath.row]) 
} 

func viewDetailViewController(index: Int, employee: Employee) { 
    let detailController = storyboard.instantiateViewControllerWithIdentifier("DetailViewController") as? DetailViewController 
    detailController.currentEmployee = employee 
    // present/push/etc detail controller 
    present(detailViewController, animated: true, completion: nil) 
} 

var employee : Employee? 
... 

override func viewDidLoad() { 
    super.viewDidLoad() 
    if let employee = currentEmployee { 
     getJson().testsearchJSON(employee.id, handler: {(employeeDetails) -> Void in 
       dispatch_sync(dispatch_get_main_queue(), { 
        //reload UI for employeeDetails 
      }) 
     }) 
    } 
} 

また、あなたは、例えば、GCDグループのために、ブロックの読み込みを待つGCDを使用することができます。

+0

ありがとうございました。 managePageViewControllerを使用しています... segueを経由せずにページをナビゲートすることは可能ですか? – xxmilcutexx

+0

あなたは歓迎です:)はい、可能です。 UIPageViewControllerのために、私はこの要点を助けてくれるかもしれません - https://gist.github.com/andreif/3bace9961c7e70995856。また、あなたはstackoverflowで検索することができます:) – Eridana

0

のための私のページです。この

func viewDetailViewController(index: Int) -> DetailViewController? { 
    if let storyboard = storyboard, 
     page = storyboard.instantiateViewControllerWithIdentifier("DetailViewController") as? DetailViewController {   

       let currentEmployee = employeeStore.searchEmployee[index] 

       getJson().testsearchJSON(currentEmployee.id, handler: {(employeeDetails) -> Void in 
         page.employee = employeeDetails 
         page.employeeIndex = index 
         return page //fail here 
       }) 
    } 
    return nil 
} 

func testsearchJSON(id:String, handler: (Employee) -> Void) { 
    let requestURL: NSURL = NSURL(string: (favUrl + id))! 
    let urlRequest: NSMutableURLRequest = NSMutableURLRequest(URL: requestURL) 

    let semaphore = dispatch_semaphore_create(0); 

    let session = NSURLSession.sharedSession() 
    let task = session.dataTaskWithRequest(urlRequest) { 
     (data, response, error) -> Void in 

     let httpResponse = response as! NSHTTPURLResponse 
     let statusCode = httpResponse.statusCode 

     //retrieve data successfully 
     if (statusCode == 200) { 
      do { 
       let json = try NSJSONSerialization.JSONObjectWithData(data!, options: .AllowFragments) 
       if data!.length > 0 && error == nil { 

        guard let name = json["firstName"] as? String, 
        let title = json["title"] as? String, 
        let id = json["id"]!, 
        let manager = json["managerName"] as? String, 
        let oa = json["oa"] as? String, 
        let email = json["email"] as? String, 
        let department = json["department"] as? String, 
        let division = json["division"] as? String, 
        let company = json["company"] as? String 
        else { 
          dispatch_semaphore_signal(semaphore); 
          return; 
        } 
        let newEmployee = Employee(id: String(id), name: name, title: title, manager: manager, oa: oa, email: email, department: department, division: division, company: company) 

        //test 

        handler(newEmployee) 
        dispatch_semaphore_signal(semaphore); 
       } 
      } catch { 
       dispatch_semaphore_signal(semaphore); 
       print("Error with JSON: \(error)") 
      } 
     } 
    } 
    task.resume() 
    dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER) 
    } 
} 
+0

GDCの返信ページの一部が失敗しました。 – xxmilcutexx

+0

このラインハンドラ(newEmployee)をスワップできます dispatch_semaphore_signal(セマフォ); – aahmetbas

関連する問題