Sono abbastanza nuovo per Objective-C & avere per modificare dinamicamente il valore di @property (strong, nonatomic) NSMutableArray *allCategories
dall'interno di AFHTTPRequestOperationManager
in success
blocco.
[self.allCategories addObject:tempObject];
non modifica il valore di allCategories
durante l'iterazione in un ciclo.
La variabile è stata inizializzata come self.allCategories = [[NSMutableArray alloc]init];
in viewDidLoad.Come modificare una variabile non globale (globale) dall'interno di un blocco?
Ho anche provato a creare una variabile temporanea come
prima di iniziare l'oggetto __block NSMutableArray *tempCategories = [[NSMutableArray alloc]init];
AFHTTPRequestOperationManager
. tempCategories
non mantiene il suo valore.
Non riesco a capire cosa sta succedendo.
Modifica
Siamo spiacenti per il disagio
viewDidLoad ha il seguente codice self.allCategories = [[NSMutableArray alloc]init];
[self loadData];
Ecco il codice
-(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;
}
Ecco il modulo di uscita NSLog:
2015/03/19 18: 27: 17,845 MyProject [4011 : 121268] viewDidLoad
2015-03-19 18: 27: 18.133 MyProject [4011: 121268] tempCategories conteggio 0
2015-03-19 18: 27: 18.136 MyProject [4011: 121268] numberOfRowsInSection conteggio 0
2015/03/19 18: 27: 18,137 MyProject [4011: 121268] conteggio numberOfRowsInSection 0
2015/03/19 18: 27: 19,019 MyProject [4011: 121268] contano le categorie 20
quando loadData
finiture allCategories non ha dati in esso (nullo).
Potete per favore inserire il codice? – jakedunc
Non hai fornito abbastanza informazioni. Cosa ti fa pensare che non stia cambiando i valori? Pubblica il codice che effettua la chiamata al tuo AFHTTPRequestOperationManager, più il codice dove concludi che la chiamata a addObject non sta facendo nulla. La mia ipotesi è che non si capisce come funzionano i blocchi di completamento asincrono e si aspetta che il valore venga modificato non appena si effettua la chiamata. –
Fai attenzione. Non si può essere sicuri di quale thread il blocco di completamento stia tornando, il che significa che potrebbe essere necessario in qualche modo rendere l'accesso al thread-safe. Questo è uno dei motivi per cui avere variabili globali in un'applicazione asincrona non è l'ideale. – damian