2

Parse.com サーバーを使用して各 PFUser の PFUsers 情報とクラスを格納するアプリを開発しています。オンラインのときはすべてをサーバーに保存できますが、インターネットに接続していないときもアプリを使用したいので、オフラインのときも保存する必要があります。

私のアプリはシンプルです、私は持っています:

  1. ログインVC

  2. すべての車を含むテーブルビュー「各 PFUSER の車」

  3. ViewController "車を追加" +

Parse.com Docs で検索すると、オフラインのときに SaveEventually が見つかりました。

- (IBAction)save:(id)sender {


    PFUser*user = [PFUser currentUser];

    PFObject *CarsObject = [PFObject objectWithClassName:@"Cars"];
    CarsObject[@"makeandmodel"] = self.MakeModelTextfield.text;
    CarsObject[@"registrationnumber"] = self.CarImmatriculation.text;
    CarsObject[@"typeofCar"] = TypeACString;
    CarsObject[@"categoryofCar"] = CategoryString;
    CarsObject[@"User"] = user;

    MBProgressHUD *hud = [MBProgressHUD showHUDAddedTo:self.view animated:YES];
    hud.mode = MBProgressHUDModeDeterminate;
    hud.animationType = MBProgressHUDAnimationZoom;
    hud.labelText = @"Uploading";
    [hud show:YES];


    NSData *imageData = UIImageJPEGRepresentation(CarsImageView.image, 0.5);
    NSString *filename = [NSString stringWithFormat:@"%@.jpg",self.CarsImmatriculation.text];
    PFFile *imageFile = [PFFile fileWithName:filename data:imageData];
    [CarsObject setObject:imageFile forKey:@"CarImage"];



    [CarObject SaveEventually:^(BOOL success, NSError*error){
        [hud hide:YES];

        if (!error) {
            [self dismissViewControllerAnimated:YES completion:nil];
        }else {

            NSLog(@"ERROR SAVE");
        }

    }];


}

上記のコードを使用すると、このエラー [エラー] が発生します。「保存されていない新しい PFFile との関係を持つ PFObject をイベント的に保存できません」という理由で「NSInternalInconsistencyException」をキャッチしました。だからうまくいかない

だから私は別のアプローチをしました.ユーザーがログインするとき(オンラインのときはログインが必須です)、次のようにサーバーからlocaldatastoreにすべての値を固定します:

- (void)FetchFromServerAtLogin{

    PFQuery*query = [PFQuery queryWithClassName:@"Cars"];
    [query whereKey:@"User" equalTo:[PFUser currentUser]];
    [query findObjectsInBackgroundWithBlock:^(NSArray*object, NSError*error){

        if (!error) {

            [PFObject pinAllInBackground:object block:nil];

        }else{

            NSLog(@"ERROR in Fetch From Server At login");
        }

    }];

}

そして、すべての車を表示し、Localdatastore から表示する Tableview があるので、次のコードで動作します。

- (void)FetchFromDatabase{

    [self ShowAircraftCategory];

    PFQuery*query = [PFQuery queryWithClassName:@"Cars"];
    [query fromLocalDatastore];
    [query whereKey:@"User" equalTo:[PFUser currentUser]];
    [query whereKey:@"categoryofCars" equalTo:self.CategoryACString];
    [query findObjectsInBackgroundWithBlock:^(NSArray*object, NSError*error){

        if (!error) {
            NSArray*temp = [NSArray arrayWithArray:object];
            self.CarsArray = [temp mutableCopy];
            [self.tableView reloadData];

        }else{

            NSLog(@"ERROR in FetchFromDatabse");
        }

    }];

}

この時点で、このコードを使用して VC から作成したすべての車を取得できます。

- (IBAction)save:(id)sender {



    PFUser*user = [PFUser currentUser];

    PFObject *CarsObject = [PFObject objectWithClassName:@"Cars"];
    CarsObject[@"makeandmodel"] = self.MakeModelTextfield.text;
    CarsObject[@"registrationnumber"] = self.CarImmatriculation.text;
    CarsObject[@"typeofcar"] = TypeACString;
    AircraftObject[@"categoryofcar"] = CategoryString;
    AircraftObject[@"User"] = user;

    MBProgressHUD *hud = [MBProgressHUD showHUDAddedTo:self.view animated:YES];
    hud.mode = MBProgressHUDModeDeterminate;
    hud.animationType = MBProgressHUDAnimationZoom;
    hud.labelText = @"Uploading";
    [hud show:YES];


    NSData *imageData = UIImageJPEGRepresentation(CarImageView.image, 0.5);
    NSString *filename = [NSString stringWithFormat:@"%@.jpg",self.CarImmatriculation.text];
    PFFile *imageFile = [PFFile fileWithName:filename data:imageData];
    [CarsObject setObject:imageFile forKey:@"AircraftImage"];



    [CarsObject pinInBackgroundWithBlock:^(BOOL success, NSError*error){
        [hud hide:YES];

        if (!error) {
            [self dismissViewControllerAnimated:YES completion:nil];
        }else {

            NSLog(@"ERROR SAVE");
        }

    }];


}

Localdatastore をサーバーに保存するために私が見つけた最後の部分と独自の方法: ボタン「LOGOUT」を使用して、localDatastore 内のすべての PFObjects をサーバーに保存し、固定解除します (インターネットがない場合はログアウトできません)。従う:

-(IBAction)Logout:(id)sender{


    PFQuery*query = [PFQuery queryWithClassName:@"Cars"];
    [query fromLocalDatastore];
    [query whereKey:@"User" equalTo:[PFUser currentUser]];
    [query findObjectsInBackgroundWithBlock:^(NSArray*arrayOb, NSError*error){

    MBProgressHUD *hud = [MBProgressHUD showHUDAddedTo:self.view animated:YES];
    hud.mode = MBProgressHUDModeDeterminateHorizontalBar;
    hud.animationType = MBProgressHUDAnimationFade;
    hud.labelText = @"Uploading";
    [hud show:YES];


        if (error == nil) {
            NSArray*Cars = [NSArray arrayWithArray:arrayOb];
            [PFObject saveAllInBackground:Cars block:^(BOOL succeeded, NSError *error){
                [hud hide:YES];
                if (error == nil) {

                    [PFObject unpinAllObjectsInBackgroundWithBlock:nil];
                    [PFUser logOut];
                    [self performSegueWithIdentifier:@"Logout" sender:self];

                }

                else{

                    UIAlertView*alert = [[UIAlertView alloc] initWithTitle:@"LOGOUT ERROR  !" message:@"\n Please Connect to The Internet to SYNC with the Server all What you saved Locally  ! " delegate:nil cancelButtonTitle:@"Ok" otherButtonTitles:nil, nil];
                    [alert show];
                }

            }];



        }else{

            UIAlertView*alert = [[UIAlertView alloc] initWithTitle:@"LOGOUT ERROR  !" message:@"\n Please Connect to The Internet to SYNC with the Server all What you saved Locally  ! " delegate:nil cancelButtonTitle:@"Ok" otherButtonTitles:nil, nil];
            [alert show];
        }

    }];




}

**私の問題は、「オフラインのときにアプリケーションを終了すると、保存せずに ImageofCar の PFFile が失われ、ローカルデータストアでイメージを取得できず、残っているのは「文字列」、つまり NameofAircraft だけです。 ect... ** この問題には解決策があります ???

ありがとう

4

2 に答える 2

1

アプリを強制終了すると、AppDelegate で次のメソッドが呼び出されます。

applicationWillTerminate:

そこでユーザーをログアウトできます。

ただし、アプリが非アクティブな状態が長すぎると、非アクティブ状態になります。アプリデリゲートの別のメソッドを使用して、そのケースを処理できます。

applicationWillResignActive:

この種のアプリ関連のものを処理できるその他の場所については、 UIApplicationDelegate プロトコルを参照してください。

于 2015-05-16T01:57:58.607 に答える
1

残念ながら、PFFile はローカル データストアに保存されていないと思います。参照:関連する質問

于 2015-09-16T22:14:52.617 に答える