2012-10-02 3 views
2

Я загружаю статус пересмотра файла из Dropbox и в основном я сравниваю загруженное количество revison в Dropbox с номером ревизии в моем локальном plist.Невозможно изменить/заменить NSDictionary Значение ключа IOS

После их сравнения я хочу изменить локальный номер версии с номером ревизии Dropbox. Но это не работает. Я собираюсь потерять свой разум.

Я помещаю несколько флагов и NSlog, кажется, что он заменяет значение, но после того, как я вызываю ту же функцию или запускаю приложение снова, я вижу, что это значение не заменяется. Это дает тот же результат снова и снова

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 *, но дважды пытаетесь установить значениеValue. Сначала сделайте mutableCopy словаря.

Смежные вопросы