1

通常、テーブルをリロードしてもクラッシュしません。しかし、バックグラウンドでデータを取得し、テーブルをリロードしてそのデータを表示すると、同時にユーザーがテーブルをスクロールするとアプリがクラッシュします。理由は、オブジェクトの配列chatDataが空であるためです。どうして空っぽなのかわからない。テーブルをリロードする直前にオブジェクトを に設定したためchatDataです。ユーザーが同時にスクロールしている場合にのみクラッシュすることに注意してください。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    // Here app crashes when chatData is empty. Don't get why it is ever empty, because reloadData is called only after setting objects.
    if ([user.userId isEqualToString:[[chatData objectAtIndex:row] objectForKey:SET_SENDER]])
    {

    }
}

- (void)refreshTable
{
    .
    .
    .
    [query findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error)
    {
        self.chatData = [objects mutableCopy];
        [chatTable reloadData];
    }
}
4

2 に答える 2

3
[query findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error)
    {
        self.chatData = [objects mutableCopy];
        [chatTable reloadData];
    }];

これはバックグラウンド スレッドで動作していると思いますか?

その場合は、 を使用して、chatData と reloadData 呼び出しの割り当てをメイン スレッドに移動する必要があります。これは、dispatch_asyncUI 呼び出しと UI が触れるすべてのデータが実行され、メイン スレッドで割り当てられる必要があるためです。

そのようです:

[query findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error)
    {
        dispatch_async(dispatch_get_main_queue(), ^{
            self.chatData = [objects mutableCopy];
            [chatTable reloadData];
        });            
    }];
于 2014-03-05T17:54:30.243 に答える
0

chatData問題は、コードのどこかを空にしていた後、テーブルがリロードさ[chatData objectAtIndex:row]れるとアプリがクラッシュすることでした。

于 2014-03-09T07:42:19.543 に答える