ios - 如何发送/返回值从 dispatch_sync(dispatch_get_main_queue(), {} 到另一个页面

标签 ios json swift xcode grand-central-dispatch

我创建了一个项目,它将检索提取的 JSON 数据并将其显示在 UITableview 中。我不想通过下载所有内容来增加应用程序的负担。因此,只有当用户选择一行时,它才会检索员工详细信息。我正在使用页面 View Controller ,以便用户能够通过滑动页面来导航每个页面。 如何将我在 dispatch_sync 中为页面发送的值发送到 detailviewcontroller 页面?

这是我在 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")

}

最佳答案

我认为在这种情况下,在 DetailViewController 中的 viewDidLoad 或 viewWillAppear 函数中编写数据获取会更好。类似的东西:

在主视图 Controller 中:

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)
}

在 DetailViewController 中:

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 等待 block 加载,例如 GCD 组。

关于ios - 如何发送/返回值从 dispatch_sync(dispatch_get_main_queue(), {} 到另一个页面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41035759/

相关文章:

arrays - 快速检索 JSON 数据

ios - 检测 iOS 中的慢速网络

ios - CLLocationManager 使我的应用程序在激活位置后崩溃

android - 如何区分推送通知的 Android 和 IOS Firebase ID?

iphone - 两个 UITableViews 一个 UIViewController 的一部分 : Each with a delegates and data sources that are different objects

python - 对于python,如何将变量传递给JSON?

swift - 如何持久化和加载 NSDatePicker 日期值

java - 如何抓取 JSON 数组并使用 gson 解析每个 json 对象? (改造)

python - 用python解析JSON : blank fields

swift - 仅 JSQMessages TextView