在JSON请求后使用新数据刷新视图控制器

时间:2015-07-08 22:16:34

标签: ios json viewdidload setneedsdisplay

<soapenv:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:urn="urn:Magento">
   <soapenv:Header/>
   <soapenv:Body>
      <urn:call soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
         <sessionid xsi:type="xsd:xxxxxxxxxxxxxxxxxxxxxxxxxxx</sessionid><resourcepath xsi:type="xsd:string">mobile.login</resourcepath><args soap-enc:arraytype="ns2:Map[1]" xsi:type="SOAP-ENC:Array"><item xsi:type="ns2:Map"><item><key xsi:type="xsd:string">email</key><value xsi:type="xsd:string">everton.com.br</value></item><item><key xsi:type="xsd:string">senha</key><value xsi:type="xsd:string">teste123</value></item></item></args>
      </urn:call>
   </soapenv:Body>    
</soapenv:Envelope>

我试图在另一个线程中完成JSON请求后刷新视图控制器中的显示。数据正确刷新,但视图没有。我在数据拉取方法的最后尝试setNeedsDisplay但它与NSRangeException索引0超出边界崩溃。我假设这是因为上面的视图控制器没有正确实例化,或者当前视图没有被释放。 ARC正在开启。

我也尝试了NSString * storyboardName = @"storyboardX"; UIStoryboard *storyboard = [UIStoryboard storyboardWithName:storyboardName bundle: nil]; UIViewController *vc = [storyboard instantiateViewControllerWithIdentifier:@"viewControllerX"]; [vc.view setNeedsDisplay]; 同样的结果。

上面的代码位于[vc.view viewDidLoad] JSON拉方法的末尾。

1 个答案:

答案 0 :(得分:1)

1)您的JSON拉力可能没有在主线程中执行(我假设这是因为您没有显示它,如果不是它应该是无论如何从服务器获取json)和GUI代码无法在后台线程上调用。

2)但是你不应该做你正在尝试的事情,除非你真的想加载视图控制器而不是刷新已经加载的现有视图控制器。 - 您拥有的代码将创建视图控制器的全新实例,但如果您现在已经有一个显示,则您将拥有同一视图控制器的两个重复实例。

您应该向视图控制器添加一个方法来重绘其内容。然后当JSON准备就绪时触发NSNotification。让您的视图控制器监听通知并调用正在刷新视图的方法。