我正在从Dropbox下载文件修订状态,基本上我将Dropbox中的下载修订号与本地plist中的修订号进行比较。无法更改/替换NSDictionary键值IOS
比较它们后,我想用Dropbox的修订版本号更改本地修订号。但它不起作用,我即将失去理智。
我把一些标志和NSlogs它似乎取代了价值,但在我调用相同的功能或再次启动应用程序后,我看到该值不会被取代。它提供了相同的输出一遍又一遍
NSString* revisionLocal = [dicInner objectForKey:@"revision"];
NSString* statusLocal = [dicInner objectForKey:@"status"];
NSLog(@"revision value before %@",revisionLocal);
NSLog(@"status value before %@",statusLocal);
//If revision has changed on dropbox, flag it as outdated on the local revision
if(![revisionLocal isEqualToString: dropBoxRevision]){
[dicInner setValue:@"outdated" forKey:@"status"];
//But the revision is the latest
[dicInner setValue:dropBoxRevision forKey:@"revision"];
//[dicInner setValue:@"outdated" forKey:@"revision"];
NSLog(@"revision value %@",[dicInner objectForKey:@"revision"]);
NSLog(@"status value %@",[dicInner objectForKey:@"status"]);
所以这给我的输出:
revision value before 4309efbbb7
status value before updated
revision value 4409efbbb7
status value outdated
而且完整的代码:
- (void)restClient:(DBRestClient *)client loadedMetadata:(DBMetadata *)metadata {
//get the local revision
NSDictionary * localRevisionDic = [FileUtils readPlistIntoDictionary:@"revision.plist"];
NSString *fileRevString = [NSString alloc];
//get the revision from Dropbox
//NSString * dropboxRevision;
if (metadata.isDirectory) {
NSLog(@"Folder '%@' contains:", metadata.path);
for (DBMetadata *file in metadata.contents) {
NSLog(@"\t%@", file.filename);
//NSLog(@"\t%@", file.lastModifiedDate);
NSLog(@"\t%@", file.rev);
//Assign dropbox revision for this file
//dropboxRevision = file.rev;
//if no local revision.plist, entry will be added. Hence init here
if (localRevisionDic==nil){
localRevisionDic = [[NSMutableDictionary alloc]init];
}
//Otherwise go through each from dropbox and campare with local
//From Dropbox
NSString * dropBoxFileName = file.filename;
NSString * dropBoxRevision = file.rev;
fileRevString = file.rev;
//if no local revision.plist entry is added for all other files
//with status need_downloaded, and no revision
if ([localRevisionDic count]==0){
//Creating revision dictionary entry for agenda.plist
NSDictionary * localRevisionDicDic = [[NSMutableDictionary alloc]init];
//when agenda.plist revision entry is added update the revision while leaving status as "new" before downloading
//will be updated accordingly if download fails
[localRevisionDicDic setValue:@"new" forKey:@"status"];
//Status is new but the revision is the latest
[localRevisionDicDic setValue:dropBoxRevision forKey:@"revision"];
[localRevisionDic setValue:localRevisionDicDic forKey:dropBoxFileName];
}else{//If there is local revision.plist compare and update accordingly
NSDictionary * dicInner = [localRevisionDic objectForKey:dropBoxFileName];
//File name Found locally
if (dicInner!=nil){
NSString* revisionLocal = [dicInner objectForKey:@"revision"];
NSString* statusLocal = [dicInner objectForKey:@"status"];
NSLog(@"revision value before %@",revisionLocal);
NSLog(@"status value before %@",statusLocal);
//If revision has changed on dropbox, flag it as outdated on the local revision
if(![revisionLocal isEqualToString: dropBoxRevision]){
[dicInner setValue:@"outdated" forKey:@"status"];
//But the revision is the latest
[dicInner setValue:dropBoxRevision forKey:@"revision"];
//[dicInner setValue:@"outdated" forKey:@"revision"];
NSLog(@"revision value %@",[dicInner objectForKey:@"revision"]);
NSLog(@"status value %@",[dicInner objectForKey:@"status"]);
}
}else{//File name not found locally newly added on dropbox
NSDictionary * localRevisionDicDic = [[NSMutableDictionary alloc]init];
//when agenda.plist revision entry is added update the revision while leaving status as "new" before downloading
//will be updated accordingly if download fails
[localRevisionDicDic setValue:@"new" forKey:@"status"];
//But the revision is the latest
[localRevisionDicDic setValue:dropBoxRevision forKey:@"revision"];
[localRevisionDic setValue:localRevisionDicDic forKey:dropBoxFileName];
}
}
}
}
//At this point agendaRevisionDicTemp contains all the files in dropbox entered/updated.
[[self agenda] setRevision:localRevisionDic];
//*****The following block is needed to determine is new agenda is needed or not.
BOOL newAgendaNeeded = false;
NSMutableDictionary * agendaRevisionDicLocal = [localRevisionDic objectForKey:@"agenda.plist"];
//NSString * localRevision = [agendaRevisionDicLocal objectForKey:@"revision"]; //what is this value?
NSString * localStatus = [agendaRevisionDicLocal objectForKey:@"status"];
NSLog(@"Local Status= %@",agendaRevisionDicLocal);
if ([localStatus isEqualToString:@"new"] ||[localStatus isEqualToString:@"outdated"]){
newAgendaNeeded = true;
//when agenda.plist is added update the revision while leaving status as "new" before downloading
//will be updated accordingly if download fails
NSDictionary * agendaDic = [[[self agenda]revision] objectForKey:@"agenda.plist"];
[agendaDic setValue:@"updated" forKey:@"status"];
NSLog(@"agendaDic where update %@",agendaDic);
}
//*****The above block is needed to determine is new agenda is needed or not.
//If new agenda is needed download
if (newAgendaNeeded){
//Download agenda.plist
NSString *documentsDirectory = FileUtils.getDocumentsDirectory;
[[self restClient] loadFile:@"/agenda.plist" intoPath: [ NSString stringWithFormat:@"%@/%@",documentsDirectory,@"agenda.plist"] ];
} else{//Else display the scene
[self populateSceneFromAgenda];
}
[restOfView reloadData];
// Add at start of requestFinished AND requestFailed
[MBProgressHUD hideHUDForView:self.view animated:YES];
}
任何想法我怎么能代替那个价值?
你真的不应该调用一个NSMutableDictionary NSDictionary! 'NSDictionary * localRevisionDicDic = [[NSMutableDictionary alloc] ...' – Till
当我分配和设置所有这些NSMutable我得到'不兼容'类型警告但这种方式我现在得到警告 –
上面的评论是正确的关于不可变的字典,奇迹是你在哪里设定的[[self agenda] setRevision:localRevisionDic];'方法能跳过定义吗? –