2

我正在从 Dropbox 下载文件修订状态,基本上我将 Dropbox 中下载的修订号与本地 plist 中的修订号进行比较。

在比较它们之后,我想用 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

2 回答 2

2

您不尊重 NSDictionary 对象的不变性。您将 localRevisionDic 声明为 NSDictionary*,但稍后可以为其分配 NSMutableDictionary 的值。localRevisionDicDic 声明为 NSDictionary* 但使用 NSMutableDictionary 的值初始化。在编译时应警告以下两个分配。在线

[localRevisionDic setValue:localRevisionDicDic forKey:dropBoxFileName];

谁知道 localRevisionDic 是可变的还是不可变的?
然后,再次将 dicInner 声明为 NSDictionary*,但稍后尝试 setValue 两次。首先制作字典的 mutableCopy。

于 2012-10-02T17:55:26.493 回答
0

我猜您的字典更改正确您的代码有什么问题应该是您没有将字典保存到您编辑的 plist

事实上,这种方法肯定有问题[[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");
    }
于 2012-10-02T18:58:49.867 回答