Я совершенно новый для Objective-C & должен динамически изменять значение @property (strong, nonatomic) NSMutableArray *allCategories
изнутри AFHTTPRequestOperationManager
в success
блоке.
[self.allCategories addObject:tempObject];
не изменяет значение allCategories
при повторении в петле.
Эта переменная была инициализирована как self.allCategories = [[NSMutableArray alloc]init];
in viewDidLoad.Как изменить нелокальную (глобальную) переменную изнутри блока?
Я также попытался создать временную переменную как
перед тем, как начать __block NSMutableArray *tempCategories = [[NSMutableArray alloc]init];
AFHTTPRequestOperationManager
объект. tempCategories
даже не сохраняет свою ценность.
Не могу понять, что происходит.
Редактировать
Извините за неудобства
viewDidLoad имеет следующий код self.allCategories = [[NSMutableArray alloc]init];
[self loadData];
Вот код
-(NSMutableArray *)loadData
{
__block NSMutableArray *tempCategories = [[NSMutableArray alloc]init];
manager = [AFHTTPRequestOperationManager manager];
[manager GET:kAPICategoryList
parameters:nil
success:^(AFHTTPRequestOperation *operation, id responseObject) {
// downcast id to NSMutableDictionary
NSMutableDictionary *json = (NSMutableDictionary *)responseObject;
// check if dictionary is non nil has at least 1 element
if (json != nil && [json count] >= 1) {
// NSLog(@"json:\t%@", json);
// check json is non nil & has success message
if ([json objectForKey:kAPIKeyCategoryRoot] != nil) {
NSArray *arrCategoriesRoot = [json objectForKey:kAPIKeyCategoryRoot];
// check categories has some data
if (arrCategoriesRoot.count >= 1) {
for (int i = 0; i < arrCategoriesRoot.count; i++) {
SomeModel *pCategory;
NSDictionary *dctCategorySingle = [arrCategoriesRoot objectAtIndex:i];
// check category has sub category
if ([dctCategorySingle objectForKey:kAPIKeyCategorySubCategory] != nil) {
// create category with sub category
pCategory = [[SomeModel alloc]initWithSubCategorisedCategoryID:[dctCategorySingle objectForKey:kAPIKeyCategoryID]
name:[dctCategorySingle objectForKey:kAPIKeyCategoryName]
image:kIMGCategoryDefault
subCategory:[dctCategorySingle objectForKey:kAPIKeyCategorySubCategory]];
} else{
// create just a category
pCategory = [[SomeModel alloc]initWithCategoryID:[dctCategorySingle objectForKey:kAPIKeyCategoryID]
name:[dctCategorySingle objectForKey:kAPIKeyCategoryName]
image:kIMGCategoryDefault];
} // else just
[tempCategories addObject:pCategory];
[_allCategories addObject:pCategory];
} // for
NSLog(@"categories count %lu", [self.allCategories count]);
} // if count >= 1
}
else if ([json objectForKey:kAPIRespMsgCategoryFetchErrKey] != nil) {
[Utility showAlertWithTitle:kAPIRespMsgCategoryFetchErrKey
message:[json objectForKey:kAPIRespMsgCategoryFetchErrVal]
button:kMsgButtonOkayTtl];
}
} else {
// error in login => enable login
NSLog(@"%@", kMsgNetworkEmptyJSON);
}
}
// network error
failure:^(AFHTTPRequestOperation *operation, NSError *error) {
NSLog(@"error %@", [error localizedDescription]);
}];
NSLog(@"tempCategories count %lu", [tempCategories count]);
return tempCategories;
}
Вот выходной формы NSLog:
2015-03-19 18: 27: 17.845 MyProject [4011 : 121268] viewDidLoad
2015-03-19 18: 27: 18.133 MyProject [4011: 121268] tempCategories count 0
2015-03-19 18: 27: 18.136 MyProject [4011: 121268] numberOfRowsInSection count
2015-03-19 18: 27: 18,137 MyProject [4011: сто двадцать одна тысяча двести шестьдесят-восемь] Количество numberOfRowsInSection 0
2015-03-19 18: 27: 19,019 MyProject [4011: 121268] кол категории 20
, когда loadData
отделки allCategories не имеет данные в нем (ноль).
Можете ли вы разместить код? – jakedunc
Вы не предоставили достаточно информации. Почему вы думаете, что это не изменение ценностей? Отправьте код, который выполняет вызов вашего AFHTTPRequestOperationManager, плюс код, в котором вы заключаете, что вызов addObject ничего не делает. Я предполагаю, что вы не понимаете, как работают блоки завершения async, и ожидаете, что значение будет изменено, как только вы сделаете вызов. –
Будьте осторожны. Вы не можете быть уверены в том, из какого потока возвращается ваш блок завершения, а это значит, что вам может понадобиться каким-то образом сделать ваш массив доступным к потоку. Это одна из причин, почему глобальные переменные в асинхронном приложении не идеальны. – damian