2012-10-02 37 views
2

我正在从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]; 
} 

任何想法我怎么能代替那个价值?

+4

你真的不应该调用一个NSMutableDictionary NSDictionary! 'NSDictionary * localRevisionDicDic = [[NSMutableDictionary alloc] ...' – Till

+0

当我分配和设置所有这些NSMutable我得到'不兼容'类型警告但这种方式我现在得到警告 –

+0

上面的评论是正确的关于不可变的字典,奇迹是你在哪里设定的[[self agenda] setRevision:localRevisionDic];'方法能跳过定义吗? –

回答

0

我猜你的字典改变什么不对您的代码应该是你救不了做你的字典中的plist编辑

其实有deffinetly蹊跷的是方法[[self agenda] setRevision:localRevisionDic];

尝试从[[self agenda] setRevision:localRevisionDic];加入下面的代码

//write dictionary to plist 
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString *documentsDirectory = [paths objectAtIndex:0]; 
    NSString *path = [documentsDirectory stringByAppendingPathComponent:@"revision.plist"]; 
    // write plist to disk 
    [localRevisionDic writeToFile:path atomically:YES]; 

    // read it back in with different dictionary variable 
    NSMutableDictionary *savedStock = [NSMutableDictionary dictionaryWithContentsOfFile:path]; 
    if(savedStock==nil){ 
     NSLog(@"failed to retrieve dictionary from disk"); 
    } 
+0

谢谢,解决了它 –

2

你不尊重你的NSDictionary对象的不可变性。您将localRevisionDic声明为NSDictionary *,但稍后可以为其指定NSMutableDictionary的值。 localRevisionDicDic声明为NSDictionary *,但用NSMutableDictionary的值初始化。在编译时应该警告两个任务。在行

[localRevisionDic setValue:localRevisionDicDic forKey:dropBoxFileName]; 

谁知道肯定是localRevisionDic可变或不可变的?
然后,再次声明dicInner为NSDictionary *,但尝试两次后设置值。先制作字典的mutableCopy。