0

Web のどこにも見つからなかった問題があります。Nib からロードされたカスタム セルを表示する必要があります。別のスレッドで DB から情報をダウンロードし、新しい MutableArray に割り当てます。別の配列に割り当てられ、必要に応じて呼び出されるが、Web からダウンロードされない画像もあります。下にスクロールすると、テーブルビューが「遅れる」のです。つまり、正しいセルに物を配置する必要があるためです。Facebook アプリは下にスクロールするときにセルを読み込みますが (それほど遅くはありません)、スクロールして戻ると何もリロードせず、セルは既に読み込まれています (いくつであっても)。どうすればこのようなことができますか?私のテーブルは非常に遅く、(現時点では)3つのセルしかありません..

これは私のコードです:(これはviewDidLoadにあります)

 NSString *strURL = [NSString stringWithFormat:@"..(myurl)..];
// to execute php code
NSData *dataURL = [NSData dataWithContentsOfURL:[NSURL URLWithString:[strURL stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]]];
// to receive the returend value
NSString *strResult = [[NSString alloc] initWithData:dataURL encoding:NSUTF8StringEncoding];

if(![strResult isEqualToString:@"0"]) {
    posts = [strResult componentsSeparatedByString:@"^"];
}

immProfilo = [NSMutableArray array];

for (int i = 0; i < [posts count]; i++) {
    NSArray *datiPost = [[posts objectAtIndex:i] componentsSeparatedByString:@"/"];
    FBProfilePictureView *fotoProfiloFB = [[FBProfilePictureView alloc] initWithFrame:CGRectMake(22, 22, 55, 55)];
    fotoProfiloFB.profileID = [datiPost objectAtIndex:1];
    [immProfilo addObject:fotoProfiloFB];
}

[self.postTab reloadData];

そして、それは私のテーブルビューコードです:

- (NSInteger)numberOfSectionsInTableView:(UITableView *)postTab {

return [posts count];
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    return 1;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    NSString *CellIdentifier = [NSString stringWithFormat:@"%ld_%ld",(long)indexPath.section,(long)indexPath.row];

    PostTabCell *cell = (PostTabCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    if (cell == nil) {

        NSArray *topLevelObjects = [[NSBundle mainBundle] loadNibNamed:@"PostTabCell" owner:self options:nil];
        cell = [topLevelObjects objectAtIndex:0];
    }

    NSString *annuncio = [posts objectAtIndex:indexPath.section];
    datiAnnuncio = [annuncio componentsSeparatedByString:@"/"];

   [cell addSubview:[immProfilo objectAtIndex:indexPath.section]];

    cell.nome.text = [datiAnnuncio objectAtIndex:0];
    cell.location.text = [self getAddressFromLatLon:[[datiAnnuncio objectAtIndex:2] floatValue] withLongitude:[[datiAnnuncio objectAtIndex:3] floatValue]];
    cell.testoPost.text = [datiAnnuncio objectAtIndex:4];

    return cell;
}
4

2 に答える 2

2

テーブル ビューが非常に遅い理由は、テーブル ビューがデリゲートにセル (cellForRowAtIndexPathメソッド) を要求するたびに、で同期ネットワーク リクエストを実行しgetAddressFromLatLon、メイン スレッドをブロックするためです。

即時の解決策は、少なくともこれらのテキストをある種の配列に保存することです。これにより、次回テーブル ビューが同じセルを要求するときに、ネットワーク リクエストを再度実行する必要がなくなります。

これにより、上にスクロールするとテーブルビューが遅くなるという問題が解決されますが、最初に下にスクロールするときはそうではありません。常に真と見なすことができる一般的なルールの 1 つは、ネットワーク リクエストでメイン スレッドをブロックしてはならないということです。

2 つのオプションがあります: スピナーを表示しながら、セカンダリ スレッドの最初にこれらすべてのテキストをロードします (簡単ですが、セルの数に合わせてうまくスケールアップしないなど、いくつかの問題があります)。loading address...または、アドレスが実際に読み込まれるまで、 などのプレースホルダー文字列を表示する非同期ローダーを設計する必要があります。

Totumus も彼の答えに一理ありますが、それがラグの主な原因ではありません (ただし、セルの数が増えると大きな問題になります)。

于 2013-10-09T09:09:59.313 に答える
0

あなたが説明する遅れは、再利用可能なセルに追加し続けるイメージビューによって引き起こされます。セルがリロードされるたびに、イメージビューがセルに再度追加されます。

のような機能を防ぎaddSubview:ますcellForRowAtIndexPath:。代わりに、プロファイル写真に必要なセルが既にあるカスタム セルを作成するUIImageView必要があります。

スクロール時に情報をロードする理由はgetAddressFromLatLon:、セルが作成/再利用されるたびに情報をロードする (?) ためです。これは問題ありませんが、別のスレッドで実行する必要があります (したがって、応答は非同期で処理する必要があります)。

もう一度上にスクロールしても facebook が読み込まれないのは、アプリケーションに読み込まれるときにデータがキャッシュされるためです。おそらくCoreDataで。

于 2013-10-09T09:06:27.963 に答える