iOS Swift 在 NSSUrlSession Completion Handler 之后在 Seque 中传递数据

Posted

技术标签:

【中文标题】iOS Swift 在 NSSUrlSession Completion Handler 之后在 Seque 中传递数据【英文标题】:iOS Swift passing data in Seque following NSSUrlSession Completion Handler 【发布时间】:2016-04-24 21:44:36 【问题描述】:

我知道这个问题有很多变体(“在视图之间快速传递数据?”),但我一直无法找到一个特定于我的情况的问题。这让我很担心,因为我担心我没有使用正确的设计模式。我会喜欢有关设计模式的建议以及如何解决我的特定问题的提示。

问题背景:

我正在创建一个依赖于用户位置数据的应用。用户按下一个按钮,当他们这样做时,我获取他们的纬度和经度并将其传递给一个运行 NSURLSession 到我的 Web 托管 API 的单例实例。 API 返回一个 JSON 响应,我的 NSURLSession 完成处理程序将其转换为 NSDictionary 对象,然后它返回到我的按钮的完成处理程序以及状态代码。如果状态代码表明从我的 Web API 接收到的数据是好的,那么我想通过 segue 将该数据传递给新的视图控制器,以便新的视图控制器可以格式化并将信息输出给用户。但是,如果状态显示存在错误或者我想向用户输出适当的消息,并将它们保持在同一个地图页面上,以便他们可以选择一个有效的位置(我还没有实现这个,但假设应该不会太难)。

我的问题:

我知道我什么时候想要调用一个 segue,并且我知道我想要传递给那个 segue 的 NSDictionary 对象。就是不知道怎么发。

这是我的按钮代码及其完成处理程序:

// MARK: ACTIONS
@IBAction func scheduleAppointmentButton(sender: UIButton) 
   //grab async manager singleton
    let theAsyncManager = AsyncManager.sharedAsyncManager
    //Send HTTP Request to API to Get all available Appointments
    if let lon = selectedPin?.coordinate.longitude, lat = selectedPin?.coordinate.latitude
        theAsyncManager.httpGetAppointments(lat, lon: lon)
            
                (appointments, status) -> () in
                if(status == "All Good")
                    //Want to trigger segue here and send it appointments object
                
            
     else
        //there was an error here getting the lat and lon
    

提前感谢您的帮助。如果您需要我提供任何其他信息,请告诉我。

【问题讨论】:

【参考方案1】:

我假设 appointments 是您的 API 返回的字典。您应该为您的视图控制器创建一个属性,将appointments 存储在您的完成处理程序中。然后你应该打电话给performSegueWithIdentifier:sender。最后,在prepareForSegue:sender 中,将字典分配给segue 的destinationViewController 的属性。比如:

class YourViewController: UIViewController 

    var appointments: NSDictionary?

    @IBAction func scheduleAppointmentButton(sender: UIButton) 
        //grab async manager singleton
        let theAsyncManager = AsyncManager.sharedAsyncManager
        //Send HTTP Request to API to Get all available Appointments
        if let lon = selectedPin?.coordinate.longitude, lat = selectedPin?.coordinate.latitude
            theAsyncManager.httpGetAppointments(lat, lon: lon) 
                (appointments, status) -> () in
                if(status == "All Good")
                    //Want to trigger segue here and send it appointments object
                    self.appointments = appointments

                    // Remember to perform the segue on the main thread
                    dispatch_async(dispatch_get_main_queue(), 
                        self.performSegueWithIdentifier("NameOfYourSegue", sender: nil)
                    )
                
            
         else
            //there was an error here getting the lat and lon
        
    

    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) 
        let destination = segue.destinationViewController as! YourDestinationClassName
        destination.appointments = appointments
    

【讨论】:

【参考方案2】:

这里不应该使用sender 参数...但是,您所要做的就是调用self.performSegueWithIdentifier("identifier", sender: appointments),就在注释是您的代码所在的位置。 然后在您的prepareForSegue 中,发件人参数将包含您的约会,您可以将其传递给下一个视图控制器。

【讨论】:

hmmm... 我看到一个教程建议使用这种方法,但所有 cmets 都批评它是糟糕的设计,因为如果您要在代码的另一部分调用相同的 segue 标识符,您可能会通过参数不好。 IE。您期望在第二个视图控制器中有一个 NSDictionary 约会对象,但您传递了一个零。你知道更好的方法吗?感谢您的破解! 好吧,唯一的另一种方法是拥有一个类变量并在调用完成处理程序时设置它,然后调用 performSegue 然后在您的 prepareForSegue 中,您可以使用全局变量作为传递给下一个vc

以上是关于iOS Swift 在 NSSUrlSession Completion Handler 之后在 Seque 中传递数据的主要内容,如果未能解决你的问题,请参考以下文章

ios 整理(一)swift和oc的区别

“无效的 Swift 支持”在 Xamarin.iOS 中使用本机 Swift 库

iOS+Swift:为啥音乐不能在 iPad 上播放?

如何使用 swift 在 IOS 地图上叠加图像

iOS:如何使用 Swift 在视图之间滑动

在 iOS 7 上使用 Realm 和 Swift