0

Parse バックエンドからの Question オブジェクトを PFQueryTableViewController に入力しようとしています。このメソッド内にブロックを実装するにはどうすればよいですか?

- (PFQuery *)queryForTable  // I'm having issues with using the method "findObjectInBackgroundWithBlock" in this method.
{
    PFQuery *query = [PFQuery queryWithClassName:self.parseClassName];

    [query fromLocalDatastore];
    [query orderByDescending:@"createdAt"];

    [query findObjectsInBackgroundWithBlock:^(NSArray *parseQuestions, NSError *error) { // Fetch from local datastore
        if (parseQuestions != nil) {
            NSMutableArray *mutableParseQuestions = [parseQuestions mutableCopy];
            self.questions = mutableParseQuestions;  // if Set local array to fetched Parse questions

        } else {

            if ([InternetReachabilityManager isReachable]) {

                [query findObjectsInBackgroundWithBlock:^(NSArray *parseQuestions, NSError *error) { // Fetch from Cloud
                      NSMutableArray *mutableParseQuestions = [parseQuestions mutableCopy];
                      self.questions = mutableParseQuestions;  // if Set local array to fetched Parse questions
                      [Question pinAllInBackground:parseQuestions];  // Save query results to local datastore

                }];
            }
        }
    }];

    return query;
}

ブロックがこのメソッドにある場合、このエラーが発生します。 ここに画像の説明を入力

これは、queryForTable が既にバックグラウンド プロセスになっているためですか? 私はちょうど使用する必要があります

[findObjects のクエリ]

また、フェッチに到達可能性を実装しようとしています。

  1. ローカル データストアからフェッチしてみる
  2. データが存在する場合はテーブルにロードする ネットワークに切り替える
  3. ネットワークが利用可能な場合はブロックを呼び出します
  4. ネットワーク フェッチの結果をローカル データストアに保存する

このメソッドは、フェッチしたオブジェクトを行に自動的に割り当てることになっていることは知っていますが、PFObject サブクラス オブジェクトを渡す場合の操作方法がわかりません。これが配列に関する私の説明です。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    self.question = [self.questions objectAtIndex:indexPath.row]; // Save one question from row

    static NSString *identifier = @"QuestionsCell";

    QuestionsCell *cell = [tableView dequeueReusableCellWithIdentifier:identifier];

    if (cell == nil) {
        cell = [[QuestionsCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:identifier];
    }

    [cell setQuestion:self.question];  //

    return cell;
}

これは、取得した配列を使用して tableView にデータを入力する方法です。

だから私の質問:

  1. queryForTable 内でブロックを呼び出せないのはなぜですか?
  2. queryForTable の行へのオブジェクトの自動割り当てを使用して、これを簡単にする方法はありますか?
  3. インターネットに接続できず、ローカル データストアが空の場合、どうすればよいですか?
4

1 に答える 1

0
  1. その関数でクエリを呼び出す理由はありません。クエリを作成してから返すことになっています。PFQueryTableViewController は、リクエストの実際の処理を行います。こちらのドキュメントをお読みください: https://parse.com/docs/ios/api/Classes/PFQueryTableViewController.html#//api/name/queryForTable

  2. cellForRowAtIndexPath メソッドに入ったら、 objectAtIndexPath: を呼び出すことができます。これにより、必要なオブジェクトが提供され、そのデータを使用してセルが設定されます。

    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
        PFObject *object = [self objectAtIndexPath:indexPath];
    
        UITableViewCell *cell = ....
    
        //configure cell using object here
    
        return cell;
    }
    
  3. あなたはこれを行います(半疑似コード)

    -(NSInteger)tableView:(UITableView*)tableView numberOfRowsInSection:(NSInteger)section {
        if (self.objects.count == 0) {
            Put some sort of overlay that shows there are no objects to be retrieved or internet is unreachable.
        }
        return self.objects.count;
    }
    
于 2015-08-25T20:53:17.797 に答える