在显示UITableViewController之前加载数据

时间:2013-07-25 18:38:35

标签: ios uitableview objective-c-blocks

我有一个应用程序,我必须从Internet获取信息。对url的请求是在一个块中,这是在UIViewController出现之后进行的,这使得我的应用程序在运行时崩溃,因为我使用info来构造UIViewController。

我不知道如何确保代码块完成其任务并稍后使用该信息。

*的 修改 *

现在我的应用程序显示一个空表,我不知道如何显示我得到的信息。也许可以使用reloadTable,但我不知道如何。 救命啊!

StoreController.m

- (void)viewDidLoad
{
    [super viewDidLoad];
    _productData = [ProductData ProductData];
    [_productData backEndTest];
}

-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return [_listOfChips count];
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
ProductCellController *cell = (ProductCellController*)[tableView dequeueReusableCellWithIdentifier:simpleTableIdentifier];
            if (cell == nil)
            {
                NSString* nameNib = UIUserInterfaceIdiomPad == UI_USER_INTERFACE_IDIOM() ? @"ProductCellController" : @"ProductCellControllerIphone";
                NSArray *nib = [[NSBundle mainBundle] loadNibNamed:nameNib owner:self options:nil];
                cell = [nib objectAtIndex:0];
            }
            cell = (ProductCellController*)[self cellFormat:cell atTheIndex:indexPath withThelastIndex:pathToLastRow];
            cell.image.image = [UIImage imageNamed:[((Chip*)[[_productData listOfProducts] objectAtIndex:indexPath.row])image]];
            cell.title.text = [NSString stringWithFormat:@"%@", [((Chip*)[[_productData listOfProducts] objectAtIndex:indexPath.row])title]];
            cell.price.text = [NSString stringWithFormat:@"$ %@", [((Chip*)[[_productData listOfProducts] objectAtIndex:indexPath.row])price]];
            cell.amount.text = [NSString stringWithFormat:@"%@", [((Chip*)[[_productData listOfProducts] objectAtIndex:indexPath.row])quantity]];
}

ProductData.m

+(ProductData*)ProductData
{
    ProductData* data = [[ProductData alloc]init];
    return data;
}
- (void)backEndTest
{

    [Server getProductsWithCompletionHandler:^(id result, NSError* error)
     {
         if ( error )
         {
             NSLog(@"error %@", error);
         }
         else
         {
             //NSMutableArray* arrayProducts = [NSMutableArray array];
             int index = 0;
             for (NSDictionary* product in result)
             {
                 [_listOfProducts addObject:[[Products alloc] initWithProduct:[chip objectForKey:GSR_PARAM_PRODUCT_ID]
                                                          withTitle:[product objectForKey:GSR_PARAM_PRODUCT_DESCRIPTION]
                                                         numberUses:[product objectForKey:GSR_PARAM_PRODUCT_AMOUNT]
                                                          withPrice:[product objectForKey:GSR_PARAM_PRODUCT_PRICE]
                                                       withQuantity:[product objectForKey:GSR_PARAM_PRODUCT_AMOUNT]
                                                        withInAppID:[product objectForKey:GSR_PARAM_PRODUCT_IN_APP_ID]
                                                          withImage:[[self loadImages]objectAtIndex:index ]] ];                    
                 index++;
             }
         }
     }];

}

我不知道如何管理块并确保他的成就。有任何想法吗? 提前谢谢!

4 个答案:

答案 0 :(得分:0)

您可以创建完成块,并在完成块中创建viewcontroller。而不是在完成下载数据之前初始化viewcontroller。

如何创建完成块:

Create my own completion blocks in iOS

答案 1 :(得分:0)

我认为您可以在完成所有数据之前不加载UIViewController。或者,看起来你正在使用tableViewController,所以只需在打开它时将行数设置为零,然后当数据到达时,将行数更改为您下载的正确数字。

更新:实际上,如果你在这一行上收到错误:

 cell = [nib objectAtIndex:0];

然后看起来nib文件有问题 - 不存在,名称错误,名称大写等等。

答案 2 :(得分:0)

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section看起来像什么?

您应该返回count的{​​{1}}。

完成完成后,您需要在桌面视图上调用listOfProducts。您需要将指针传递给tableview,或者将代理协议添加到现有代码中以使其工作。

修改

添加委托协议以允许您的完成块告诉tableview重新加载。像这样:

ProductData.h

reloadData

ProductData.m

在完成块结束时,加载完成后:

@protocol ProductDataDelegate;

@interface ProductData
@property (nonatomic, weak) id<ProductDataDelegate> delegate;
...
@end

@protocol ProductDataDelegate <NSObject>
-(void)didFinishLoading;
@end

StoreController.m

将代理设置为指向if (self.delegate != nil) { [self.delegate didFinishLoading]; } 对象。

StoreController

并添加代码以重新加载,假设StoreController是viewDidLoad() ... _productData = [ProductData ProductData]; _productData.delegate = self; ... 的子类。

UITableViewController

那应该是它!

答案 3 :(得分:0)

另一种解决方案可以是:

在ProductData.m中

- (void)viewDidLoad
{
    [super viewDidLoad];
    _productData = [ProductData ProductData];
    [self loadDataFromServer:^{
        [self.tableView reloadData];
    }];
}

-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return [_listOfChips count];
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
ProductCellController *cell = (ProductCellController*)[tableView dequeueReusableCellWithIdentifier:simpleTableIdentifier];
            if (cell == nil)
            {
                NSString* nameNib = UIUserInterfaceIdiomPad == UI_USER_INTERFACE_IDIOM() ? @"ProductCellController" : @"ProductCellControllerIphone";
                NSArray *nib = [[NSBundle mainBundle] loadNibNamed:nameNib owner:self options:nil];
                cell = [nib objectAtIndex:0];
            }
            cell = (ProductCellController*)[self cellFormat:cell atTheIndex:indexPath withThelastIndex:pathToLastRow];
            cell.image.image = [UIImage imageNamed:[((Chip*)[[_productData listOfProducts] objectAtIndex:indexPath.row])image]];
            cell.title.text = [NSString stringWithFormat:@"%@", [((Chip*)[[_productData listOfProducts] objectAtIndex:indexPath.row])title]];
            cell.price.text = [NSString stringWithFormat:@"$ %@", [((Chip*)[[_productData listOfProducts] objectAtIndex:indexPath.row])price]];
            cell.amount.text = [NSString stringWithFormat:@"%@", [((Chip*)[[_productData listOfProducts] objectAtIndex:indexPath.row])quantity]];
}

- (void)loadDataFromServer
{

    [Server getProductsWithCompletionHandler:^(id result, NSError* error)
     {
         if ( error )
         {
             NSLog(@"error %@", error);
         }
         else
         {
             //NSMutableArray* arrayProducts = [NSMutableArray array];
             int index = 0;
             for (NSDictionary* product in result)
             {
                 [_listOfProducts addObject:[[Products alloc] initWithProduct:[chip objectForKey:GSR_PARAM_PRODUCT_ID]
                                                          withTitle:[product objectForKey:GSR_PARAM_PRODUCT_DESCRIPTION]
                                                         numberUses:[product objectForKey:GSR_PARAM_PRODUCT_AMOUNT]
                                                          withPrice:[product objectForKey:GSR_PARAM_PRODUCT_PRICE]
                                                       withQuantity:[product objectForKey:GSR_PARAM_PRODUCT_AMOUNT]
                                                        withInAppID:[product objectForKey:GSR_PARAM_PRODUCT_IN_APP_ID]
                                                          withImage:[[self loadImages]objectAtIndex:index ]] ];                    
                 index++;
             }
         }
     }];

}