【问题标题】:Holding view display until response arrives from server保持视图显示,直到服务器响应到达
【发布时间】:2013-01-10 05:56:47
【问题描述】:

在我的应用程序中,我有一个 UITableViewController 并根据用户选择实例化一个新的 UIViewController 并通过 tcp 套接字发送对服务器的请求。

在响应从服务器到达之前,它已经运行了UIViewController 的“viewDidLoad”方法。 在大多数情况下,还没有收到回复。

我的问题是:在收到响应并在viewDidLoad 方法中处理数据之前,如何阻止viewDidLoad 运行?

如果可能的话,还可以使整个过程异步,这样在响应到达之前它不会卡住整个应用程序。

谢谢!

【问题讨论】:

    标签: ios objective-c uitableview uiviewcontroller


    【解决方案1】:

    无论您在 viewDidLoad 中执行什么数据处理,都将其移至单独的函数。当您从服务器通知视图控制器或调用委托接收数据时,并在收到通知或委托调用后,通过调用您为数据处理分离的方法进行数据处理。

    【讨论】:

    • 我理解你!!你是对的。我确实有一个委托,当响应从服务器到达时被调用,我需要处理消息并设置 UIViewController 的所有数据!谢谢!另一个问题:如果在等待响应时用户决定按“返回”关闭 UIViewController 然后返回到 UITableViewController 并决定选择不同的 UIViewController??
    • 只有你需要处理来自服务器的响应。当按下返回按钮时,您的视图控制器将被释放。无论您使用何种数据获取模型,都会在获得响应后尝试调用委托,并在释放视图控制器时崩溃。在模型中,您必须在调用任何委托方法之前检查委托是否存在。
    • 据我所知,每次实例化一个新的 UIViewController 时,我都会将其设置为处理响应的委托。所以我猜 UIViewController_X 可能会收到一条打算发送给 UIViewController_Y 的消息,我必须在 X 中忽略它。对吗?
    • 您的数据获取模型是共享实例还是每次创建视图控制器时都创建新的?
    • 共享。我有一个套接字类作为属性驻留在我的 AppDelagate 类中。并从 UITableViewController 我访问它以设置响应和向服务器发出请求的委托。这很糟糕吗??
    【解决方案2】:

    首先根据我的建议,您需要从表中选择一行然后调用您的UIViewController & 在此类中,您可以编写一个单独的方法,例如

        -(void)GetData{}
    

    然后在后台线程中调用它

        [self performSelectorInBackground:@selector(GetData) withObject:nil];
    

    这个调用服务和获取数据的过程在后台工作,当它的响应来自服务器时,你会做一些事情,比如在视图中填充数据或显示它。

    通过这样做,您的应用将不会静止,直到您的响应到来。

    【讨论】:

    • 我需要以某种方式将 GetData 传递给我的套接字类,以便在响应到达时调用 GetData 并响应??
    • 是的,Shvalb 您可以通过在该类上添加委托方法来从您的Shocket 类中调用GetData,您可以调用当前的viewcontroller 类方法-(void)GetData;
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-07
    • 1970-01-01
    • 2014-09-02
    • 2014-01-01
    • 1970-01-01
    相关资源
    最近更新 更多