如果会话完成下载数据,如何使tableView重新加载?

时间:2014-10-22 01:22:29

标签: objective-c uitableview delegates

我的应用程序从URL获取数据。我使用NSURLSession异步下载数据。 数据将在Tableview中重新排列和显示。所以一切都需要在viewDidload上做好准备。

问题是,异步平均数据准备将比主线程的速度慢1秒。

查看已加载,Tableview获得0数据,并显示0数据。

1秒后,第二个线程运行完成处理程序,并将数据从Internet存储到@property中。

但是tableView是用NOTHING DISPLAY加载的,它需要RELOAD。

  • 第一个解决方案

是的,我可以解决这个问题,我只需要调用[self.delegate.tableView reloadData];在GDC主线程内部(这是完成处理程序内部)但是它违反了MVC模式!

  • 第二个解决方案

所以我需要找出第二个解决方案,让ViewController为自己的Model实现委托,因此GDC中的代码将是 [self reloadTableViewData]; 而不是 [self。 delegate.tableView reloadData]

这些 - (void)reloadTableViewData将由Viewcontroller实现

  • 第二个解决方案失败

不幸的是,我的第二个解决方案因"无法识别的选择器发送到实例Model"

而失败
  • 我的问题

1)使用异步数据URL提取重新加载TableView的正确解决方案,如何通知并让视图控制器知道"您的数据准备就绪,重新加载"

2)为什么我的第二个解决方案失败了? (我的代表怎么了?它似乎是我代表的错误原因)

这是我的第二个解决方案的基本代码测试,相同的错误"无法识别的选择器发送到实例...."

Viewcontroller.h

 #import <UIKit/UIKit.h>

 @class Protocol_Holder;

 @interface ViewController : UIViewController

 @property (strong ,nonatomic) Protocol_Holder* holderObject;

 @end

Viewcontroller.m

 #import "ViewController.h"
 #import "Protocol_Holder.h"

 @interface ViewController () <myDelegate>
 @end

 @implementation ViewController

 -(Protocol_Holder*) holderObject{
     if(!_holderObject){
         _holderObject =  [[Protocol_Holder alloc]init];
     }
     return _holderObject;
 }

 - (IBAction)ReloadButton:(UIButton *)sender {

     NSLog(@"Button Pushed");
     [self.holderObject reload_container];
 }

 - (void)viewDidLoad
 {
     [super viewDidLoad];
      self.holderObject.delegate = self;

 }


 -(void) reload_Model{
     // this is where [self.tableView reloadData] should begin;
     NSLog(@"Enemy Reload Reload Reload Reload!!");
 }

 @end

Protocol_Holder.h

 #import <Foundation/Foundation.h>

 protocol myDelegate <NSObject>

 -(void) reload_Model;

 @end


 @interface Protocol_Holder : NSObject {id<myDelegate> delegate;}

 @property (weak,nonatomic) id<myDelegate> delegate;

 -(void) reload_container;

 @end

Protocol_Holder.m

 #import "Protocol_Holder.h"

 @interface Protocol_Holder() <myDelegate>

 @end

 @implementation Protocol_Holder

 -(void) reload_container{
     [self reload_Model];
 }
 @end

1 个答案:

答案 0 :(得分:0)

wrong ready所有内容都必须viewDidload,因为request downloading dataown time depending } connectivity show activity indicator displaying message Please wait as downloding neccessary data Downloading request viewDidload。{/ 1> 可以在tableView方法

中添加

header

此外,您的displaying应该message no records download completes reload tableView

download fails时,您可以alert userdisplaying appropriate message然后{{1}} {{1}}