0

ローカルの SQLite データベースがあり、多数のレコードを返す必要があります。読み込みに数秒かかるので、アクティビティインジケーターを追加したい。アクティビティ インジケータは正常に動作しているように見えますが、問題はプールが配列に値を返すことを許可していないことです。以下を参照してください。

  - (void)viewDidLoad
    {
        [super viewDidLoad];

        activityIndicator = [[[UIActivityIndicatorView alloc]initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray] autorelease];
        activityIndicator.frame = CGRectMake(0.0, 0.0, 48.0, 48.0);
        activityIndicator.center = self.view.center;
        [self.view addSubview:activityIndicator];

        [UIApplication sharedApplication].networkActivityIndicatorVisible = YES;
         [activityIndicator startAnimating];            


     [self performSelectorInBackground:@selector(loadData) withObject:nil];   

    }
//What I need to load from SQLITE
-(void)loadData {

    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; // Path to the database

//CODED HERE FOR DATABASE TO OPEN AND QUERY HERE TO BUILD ARRAYS

        NSString *firstField = [NSString stringWithUTF8String:cFirst];
                NSString *secondField = [NSString stringWithUTF8String:cSecond];
                NSString *thirdField = [NSString stringWithUTF8String:cThird];


                [FirstArray addObject:firstField];
        [SecondArray addObject:secondField];
                [ThirdArray addObject:thirdField];  

   //Checking to see if records are being added to the arrays
NSString *recordAdded = [NSString stringWithFormat:@"%@ - %@ - %@", firstField, secondField, thirdField];

                    NSLog(@"Song: %@", recordAdded);

    [UIApplication sharedApplication].networkActivityIndicatorVisible = NO;     
    [activityIndicator stopAnimating];

  [pool release];   
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    static NSString *CellIdentifier = @"Cell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil)
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier] autorelease];

        NSString *firstValue = [firstArray objectAtIndex:indexPath.row]; 
        NSString *secondValue = [secondArray objectAtIndex:indexPath.row];
        NSString *thirdValue = [thirdArray objectAtIndex:indexPath.row];

        NSString *details = [NSString stringWithFormat:@"%@ - %@", secondValue, thirdValue];


        cell.textLabel.text = cellValue;

        cell.detailTextLabel.text = details ;

        cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;

    return cell;
}

デバッガーを見ていると、アクティビティ インジケーターの進行に合わせて配列が構築されていることがわかります。問題は、プールの解放によってアレイも解放されていると思うことです。

プールとアクティビティ インジケーターを追加しない場合、コードはテーブル ビューでクエリを正常に返します。

それがここで起こっている場合、誰かがアレイを解放しないように正しい方向に向けるのを手伝ってくれますか? どんな種類の助けも大歓迎です。:-)

---また--- さらに調べてみると、配列をメインスレッドに戻す必要があることがわかりました。これはネットで検索して集めたものです。

[self performSelectorOnMainThread:@selector(done:) withObject:cellData waitUntilDone:NO];

これらの配列をテーブルにロードするにはどうすればよいですか?

4

3 に答える 3

0

プールが配列を解放するかどうかわからないので、コードはかなり直接的です。データベースから実際にデータを取得しているかどうかを確認したい場合があります。

ただし、バックグラウンド スレッドでアクティビティ インジケーターのアニメーションを停止していることに気付きました。UI アクティビティはメイン スレッドで実行する必要があります。昨夜このコーディングを行い、このスレッドを使用して問題を解決しました。performSelectorOnMainThread で指定されたセレクターにアニメーション停止コードを配置します。

于 2012-07-06T05:43:10.170 に答える
0

[tableview reloadData]の最後に追加してみてください-(void)loadData method

于 2012-08-28T18:37:53.843 に答える
0

文字列は配列に追加されているため問題ありません。

配列が解放されているように見えますが、そのコードは表示されません。

配列自体をどのように作成していますか? 自動解放されている場合は、プールを空にするときに割り当てが解除されます。「autorelease」するのではなく、「保持」する必要があります。

于 2012-07-06T14:00:31.840 に答える