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);
}
}