2016-12-08 2 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

Я думаю, что этот случай было бы лучше записывать данные в функцию viewDidLoad или viewWillAppear в DetailViewController. Нечто подобное:

В MainViewController:

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 групп.

+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

Смежные вопросы