【发布时间】:2016-05-09 20:16:41
【问题描述】:
我查询到 DynamoDB。结果存储在 queryResult 数组中。随着对数据库的每个新查询,queryResult 数组的值正在更改(替换)。当我想用所有潜在结果填充我的表格视图控制器(添加的朋友列表)时,问题就来了。
我想创建一个新数组来添加每个新收到的结果,但不幸的是,它的值会被每个新的查询结果覆盖。例如,如果我第一次想添加“Adam”,下一次想添加“Michael”,我想要一个包含值的数组:(Adam, Michael)。现在,迈克尔覆盖了亚当。我问你如何强制一个数组存储每个新添加的结果——而不是覆盖现有的结果。稍后我想遍历该数组以填充表格行。我将不胜感激每一个提示,建议。非常感谢。
- (IBAction)addButton:(UIButton *)sender {
//To store credentials typed by user.
NSString *userName = self.nameTypedTextField.text;
NSString *phoneNumber = self.phoneNumberTextField.text;
//To query for typed credentials.
AWSDynamoDBQueryExpression *query = [AWSDynamoDBQueryExpression new];
query.hashKeyAttribute = @"userPhoneNumber";
query.hashKeyValues = phoneNumber;
//To receive typed credentials.
AWSDynamoDBObjectMapper *objectMapper = [AWSDynamoDBObjectMapper defaultDynamoDBObjectMapper];
[[objectMapper query:[Users class] expression:query] continueWithBlock:^id(AWSTask *task) {
if (task.error) NSLog(@"The request failed. Error: [%@]", task.error);
if (task.exception) NSLog(@"The request failed. Exception: [%@]", task.exception);
if (task.result) {
//I receive query result.
AWSDynamoDBPaginatedOutput *paginatedOutput = task.result;
NSArray *queryResult = [[NSArray alloc] initWithArray:paginatedOutput.items];
NSLog(@"Query result: %@", queryResult);
//I wanted to create array that adds every object that is being stored in queryResult array. It doesnt work - it simply replaces its value with new result.
NSMutableArray *array = [[NSMutableArray alloc] init];
[array addObjectsFromArray:queryResult];
NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
//Must be converted to NSData becouse of: Attempt to set a non-property-list object as an NSUserDefualts.
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:queryResult];
[userDefaults setObject:data forKey:@"User Data"];
[[NSUserDefaults standardUserDefaults] synchronize];
}
return nil;
}];
}
编辑: 您需要先保存您的第一个查询结果。 arrayByAddingObjectFromArray 需要 noempty 数组 (previousQueryResult) 来添加来自另一个数组 (queryResult) 的结果。否则,您将得到空语句,并且您将无法叠加结果。该问题仅在应用程序首次启动时出现。
if (task.result) {
//To receive query result.
AWSDynamoDBPaginatedOutput *paginatedOutput = task.result;
NSArray *queryResult = [[NSArray alloc] initWithArray:paginatedOutput.items];
NSLog(@"Query result: %@", queryResult);
//Get the previously stored query results.
NSData *previousData = [[NSUserDefaults standardUserDefaults] dataForKey:@"User Data"];
NSArray *previousQueryResults = [NSKeyedUnarchiver unarchiveObjectWithData:previousData];
//If previousQueryResults is empty (due to first applcation launch).
if ([previousQueryResults count] == 0) {
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:queryResult];
[[NSUserDefaults standardUserDefaults]setObject:data forKey:@"User Data"];
[[NSUserDefaults standardUserDefaults] synchronize];
} else {
//Get the previously stored query results.
NSData *previousData2 = [[NSUserDefaults standardUserDefaults] dataForKey:@"User Data"];
NSArray *previousQueryResults2 = [NSKeyedUnarchiver unarchiveObjectWithData:previousData2];
//Add the new query results to what was previously stored.
NSArray *updatedArray = [previousQueryResults2 arrayByAddingObjectsFromArray:queryResult];
NSLog(@"Updated array: %@", updatedArray);
//Store the combined query results to user defaults.
NSData *dataUpdated = [NSKeyedArchiver archivedDataWithRootObject:updatedArray];
[[NSUserDefaults standardUserDefaults]setObject:dataUpdated forKey:@"User Data"];
[[NSUserDefaults standardUserDefaults] synchronize];
}
}
【问题讨论】:
标签: ios objective-c arrays initialization nsuserdefaults