私はiOSプログラミングが初めてで、多くの人が同じ問題に直面していると確信しています。iOS - 変数を割り当てた後にブロックが常にデータを取得するときのブロックの実行順序を制御する方法は?
問題は、httpリクエストを処理するのにAFNetworking
を使用しています。
私のinit
メソッドでデータを取得しようとしていますが、これらのデータを持つ変数をViewDidLoad()
に割り当てたいとします。
AFNetworking
はget
リクエストをブロック**(おそらく非同期のものですが、私はまだスレッドについて学んでいません)**で送信しているようです。
私が割り当てているとき、私が得ようとしているデータはまだ戻っています。
私は
The execution of block is always delayed
block execution iOS and assigning variable
Variable returning null after block execution
のような答えをググが、何の解決策を見つけませんしました。
これはマルチスレッドメカニズムが原因であるかどうか、どうやって問題を解決できますか?
CODE
HomeController.m
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
NSInteger cateid = indexPath.row + 1;
HomeTabCategoryController* categoryController = [[HomeTabCategoryController alloc] initWithCategoryId:cateid andCategoryName:[_categories objectForKey: [@(indexPath.row + 1) stringValue]]];
[self.navigationController pushViewController:categoryController animated:YES];
}
CategoryController.m
-(instancetype)initWithCategoryId:(NSInteger)categoryId andCategoryName:(NSString*)categoryName{
self = [super init];
if (!self) {
return nil;
}
[ProductModel getProductsIdOfCategory:_categoryId success:^(BOOL result, NSString* message, NSArray* productIds){
if (!result) {
_productIds = productIds;
}else{
[self toast:message];
}
}failure:^(NSError* error){
NSLog(@"%@", error);
}];
return self;
}
-(void)viewDidLoad{
NSLog(@"loading view");
[super viewDidLoad];
self.title = _categoryName;
[self getData];
}
- (void)getData{
for (NSNumber* proId in _productIds) {
[ProductModel getProductWithId:[proId integerValue] success:^(BOOL result, NSString* message, ProductEntity* product){
if (!result) {
[_products addObject:product];
}else{
[self toast:message];
}
}failure:^(NSError* error){
NSLog(@"%@", error);
}];
}
}
getData
が実行され、 _productIds
はまだnil
です(私はそれをsuccess
ブロックに割り当てます)。
あなたはいくつかの詳細を共有できますか? なぜINITに電話する必要がありますか? これはGCDシリアルキューで実現できると思います。 –
これは 'HomeController'に' UITableView'があり、特定の行を選択すると新しいビューを表示したいからです。実際に私は前に 'GCD'について学んだことはありません。 'GCD'に問題があるなら、間違いなく文書を手に入れて使い方を学びます。しかし、問題は、私はまったく問題がないということでもありません。私はコードがどのように機能するかについてより詳しく知りたいと思っています。アドバイスをお願いしますか?ブロックにスレッドが作成されていますか?ブロックは実際にいつ実行されますか?少し早いですがお礼を。 :) –