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の値で初期化されています。次の2つの割り当ては、コンパイル時に警告する必要があります。ラインで

[localRevisionDic setValue:localRevisionDicDic forKey:dropBoxFileName];

localRevisionDicが可変または不変であることを誰が確実に知っていますか?
次に、もう一度、dicInnerをNSDictionary *として宣言しますが、後で2回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 に答える