0

設定しました。最後のセルが表示されたら、threadProcessでセルを追加します。

-(void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell      forRowAtIndexPath:(NSIndexPath *)indexPath
 {
    int nArrayCount;
    nArrayCount=[self.mAppGameList count];
    int row= (int)indexPath.row ;

    if(row == nArrayCount)
    {
        if(mSearchGame_Thread != nil)
            return;

        NextSearchCell *searchCell =(NextSearchCell *)cell;

        [searchCell.mActivityView startAnimating];

        NSThread *searchThread = [[NSThread alloc] initWithTarget:self
                                                         selector:@selector(searchNextThreadProc:) object:tableView];

        self.mSearchGame_Thread = searchThread;
        [searchThread release];
        [self.mSearchGame_Thread start];
        // start new search ...

    }

//スレッドメソッド

  -(void)searchNextThreadProc:(id)param
 {

    UITableView *tableView=(id)param;

    NSMutableArray *newArray;

    newArray=[NSMutableArray arrayWithArray:self.mAppGameList];

    NSArray *pressedlist;
    nArrayCount=[self.mAppGameList count];

               .
               .
               .
   [newArray addObject:item];
   self.mAppGameList = newArray;

     [tableView reloadData];

     self.mSearchGame_Thread=nil;
 }

この方法は問題です。

  1. テーブルビューがデータをリロードするときにテーブルをスクロールすると、しばらくの間、テーブルビューが消えて表示されました。

  2. 次のセルを追加しているときにセルに触れると、excメモリが不良になることがあります。新しいテーブルをリロードする前に、tableView:didSelectRowAtIndexPath:メソッドを呼び出すと思います。したがって、テーブルのデータはそうではありません。

だから、リロードテーブルビューの方法を置き換えたいのですが、何か方法はありますか?私を助けてください。

4

1 に答える 1

2

reloadDataを使用する代わりに、UITableViewでこのメソッドを使用して、アニメーションによって新しい行を追加できます。

- (void)insertRowsAtIndexPaths:(NSArray *)indexPaths withRowAnimation:(UITableViewRowAnimation)animation;

そうすれば、リロード時にビューが消えたり再表示されたりすることはありません。

この質問を参照してください:UITableViewセルアニメーションを追加

また、次を使用して、メインスレッドでUIの更新を必ず実行してください。

[self performSelectorOnMainThread:@selector(refreshMethodName) withObject:nil waitUntilDone:NO];

あなたのコードについてのいくつかのコメント:

  • 上記のようにコードで使用する場合は、mAppGameListがretain-propertyまたはcopy-propertyのいずれかであることを確認してください。そうしないと、アクセスが悪くなる可能性があります。
  • searchNextThreadProcが一度に複数回呼び出されないようにする必要があります。そうしないと、タイミングとパフォーマンスの問題が発生する可能性があります。スレッドセーフには見えません。
  • 通常、UITableViewから少し離れたコンテンツデータを処理する必要があります。すでに配置されているデータのリストを表示するためのツールとして、テーブルビューを参照してください。データの検索などについて心配する必要はありません。代わりに、NSMutableArrayで操作しているデータを保持する別のクラスを使用して、必要なときにデータを入力し続けます。このクラスは、メソッド呼び出しを介してtableViewによる新しいデータの検索を開始するようにトリガーできますが、更新プロセスがスレッドセーフであり、UIからの複数の呼び出しに対して持続可能であることを確認してください。一度に10xrefresh呼び出しを行うと、一度に1回だけ更新することになります。(たとえば、サーバーへの10回の同時呼び出しは必要ありません)このコンテンツリストは、UITableViewのリストから完全に分離する必要があります。
  • 新しいデータが利用可能になったら、呼び出すことができる更新メソッドを作成して、更新するようにUITableViewに指示します。UITableViewを更新するときに、mAppGameListプロパティが保持またはコピーされている場合は、リスト内のすべてのデータを再度追加する必要はありません。提案されているようにすべてのデータを含む別のクラスにNSMutableArrayがある場合は、self.mAppGameList = [NSArray arrayWithArray:[yourClassgameList]];のようなものを使用するだけです。(mAppGameListにretainを使用している場合)
  • UITableViewの更新をトリガーするときは、performSelectorOnMainThreadを使用します。新しいバックグラウンドスレッドを開始するには、NSThreadallocなどの代わりにperformSelectorInBackgroundを使用することもできます。
于 2012-05-14T15:45:28.363 に答える