0

UITableView に問題があります。バックグラウンド スレッドでデータベース サーバーからデータをロードし、完了すると通知を送信します。通知では、ビューのデータ配列を更新し、テーブルビューで reloadData を使用します。次に、テーブルビューは選択された行を選択解除し (つまり、データが再ロードされます)、別の行を選択したい場合は、NSLog であっても、didSelectRowAtIndexPath の最初の行で EXC_BAD_ACCESS を取得します。

新しい配列を割り当てない場合、バックグラウンド スレッドが変数データを提供し、reloadData を使用しない場合、didSelectRowAtIndexPath には問題はありませんが、テーブルビューには最近のレコードが表示されません。変更を確認するには、ビューを閉じてから再度開く必要がありました。これは本当にまずいので、バックグラウンド スレッドがサーバーからのレコードの読み込みを完了した直後に変更を表示したかったのです。

.h ファイルで宣言された変数:

-downloadThread は NSThread です。

-data は NSArray です。

-manager は私の SQL インターフェイスです。

-(void)viewDidLoad
{
    ...
    [super viewDidLoad];
    NSMutableArray *arr = [[manager getTeilnehmerList] retain];
    data = arr;
    [self.tableView reloadData];

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(KundenUpdated:) name:@"ContactUpdate" object:nil]; // to be notified when updating thread is finished

downloadThread = [[NSThread alloc] initWithTarget:self selector:@selector(teilnehmerLoad:) object:nil]; //Thread to get actual data on Background
[downloadThread performSelector:@selector(start) withObject:nil afterDelay:2];
    ...
}

-(void)teilnehmerLoad:(id)sender
{
    [manager loadTeilnehmerFromServerAndInsertIntoDatabase];
    //data = [manager getTeilnehmerList];
    [self.tableView reloadData];
    [[NSNotificationCenter defaultCenter] postNotificationName:@"ContactUpdate" object:nil];

}
-(void)KundenUpdated:(NSNotification*)notifaction
{
    @synchronized(self) 
    {
        //needs function to select row that was selected before reload if the data record is still there after sync with server
        [self.tableView reloadData];
        NSLog(@"count data in kundenupdated: %i",data.count);
    }
}
4

1 に答える 1

0

バックグラウンド スレッドで teilnehmerLoad が呼び出され、reloadData を呼び出していると思われますが、これはノーノーです。

performSelectorOnMainThread を使用して reloadData を実行するように (および/または KundenUpdated を) 変更します。

バックグラウンド スレッドから他の UI 操作を行っていないことを確認してください。

于 2012-11-07T13:13:47.337 に答える