我有一个应用程序,我必须从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++;
}
}
}];
}
我不知道如何管理块并确保他的成就。有任何想法吗? 提前谢谢!
答案 0 :(得分:0)
您可以创建完成块,并在完成块中创建viewcontroller。而不是在完成下载数据之前初始化viewcontroller。
如何创建完成块:
答案 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++;
}
}
}];
}