2016-07-04 3 views
0

NSTableViewデータソースのサブセットを遅延取得できますか? データベース全体をメモリにロードする必要はありませんか?テーブルがスクロールすると、アプリケーションはコアデータに再度アクセスします。私は全体データソースの遅延フェッチを有効/無効にする方法を考え出した瞬間NSTableView:テーブルのデータソースのサブセットを遅延取得できますか?

。しかし、異なる実行でフェッチを分割する方法があるかどうかを知りたいのですが」

+0

:私のtableViewDataSourceの

二つの主な方法は次のようになります。コアデータフェッチを行うときに、「オフセット」を指定することができます。フェッチリミットと組み合わせると、フェッチ範囲があることを意味します。テーブルビューに最後にフェッチされたオブジェクトが表示されたら、その数をオフセットとして使用して、次のエンティティのセットを取得します(20,50、あなたの好みに関係なく) – pnizzle

答えて

0

Offsetを指定すると、fetch limitのオフセットには範囲が与えられます。最後のオブジェクトに、別のフェッチやオフセットなど、あなたの現在のカウント、およびお好みの上限を指定します。

+0

Ok。データがNSTreeControllerにバインドされている場合(つまり、fetchOffset属性を持つNSFetchRequestを明示的に持たないようにするにはどうすればよいでしょうか? – aneuryzm

0

この場合、私のお気に入りのアプローチは以下の通りです。

私は自分のコントローラにロードされたレコードの配列を保持します。で、 viewDidLoadこの配列にはゼロ要素が含まれています。次に、データベースからレコードの最初の部分を要求します(たとえば、50レコードのフェッチ制限で制限されます)。私はそれらをこの配列に入れました。また、ストアを示すフラグは、ロードされたすべてのレコードであるかどうかを示します。私のテーブルビューで

私はいつも私の配列からすべてのレコードを表示します。すべてのレコードがロードされていない場合は、アクティビティインジケータ付きのセルを1つ追加します。ユーザーがアクティビティインジケータ付きのセルにテーブルビューをスクロールすると、データベースからレコードの次の部分のロードを要求します(オフセットとフェッチ制限を再度使用します)。レコードがロードされた後、それらを配列に追加し、フラグを更新して、tableViewでreloadDataを呼び出します。そうすることができます

-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { 
    return self.allDataLoaded?self.dataArray.count?self.dataArray.count+1; 
} 

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    if (indexPath.row>=self.dataArray.count) { 
     // indicator cell 
     [self requestReadNext]; 
     UITableViewCell* cell=[tableView dequeueReusableCellWithIdentifier:@"IndicatorCell" forIndexPath:indexPath]; 
     return cell; 
    } else { 
     MyCell* cell=[tableView dequeueReusableCellWithIdentifier:@"Cell" forIndexPath:indexPath]; 
     MyObject* obj=[self.dataArray objectAtIndex:indexPath.row]; 
     [self fillCell:cell withObject:obj]; 
     return cell; 
    } 
} 
関連する問題