初心者と一緒に我慢してください...
この問題については、主に特定のソースからの非同期データのプルと UITableView への入力を扱う、いくつかの同様の質問があります。
これらを確認し、リストされているいくつかの解決策を試してみると、まだ同じ問題が発生しています。
私のメイン アプリはタブ バーで制御されます。メイン ウィンドウは Google マップ ビューで、2 番目のタブはより高度なオプション用です。私が見ているものがメモリ使用量に関連している場合に備えて、これを取り上げます。「高度なオプション」の 1 つが問題を引き起こしています。
2 番目のタブでは、ボタンの 1 つがビュー コントローラー「Places」を起動します。ここが難所です。このクラスは、事実に基づいた ios api: https://github.com/Factual/factual-ios-sdkからデータを取得します。エリア内の場所と電話番号などの一覧です。
「Places.h」と「Places.m」のコードは次のとおりです。このView ControllerはUITableViewにデータを入力しています。iPhone 5 では、スクロールに問題はありません。iPhone 6 および 4s では、スクロールはいくつかの行で正常に機能し、その後フリーズします。しばらくすると解凍されることがあります。
これを非同期の「[tableView reloadData]」呼び出しに分離しました。Factual API への呼び出しを削除すると、同じフリーズの問題が発生し、セルに "Test" という単語が入力されます。どちらの場合も、このアプリでは、データの再読み込みによってアプリがフリーズします。
他のいくつかの投稿は、「reloadData」がパフォーマンスの低下を引き起こしていることを指摘していますが、フリーズはしていません。
他の投稿に記載されている解決策を試した後、数行下にスクロールしているときにフリーズするという同じ問題がまだあります。
スクロール中にテーブル ビューがフリーズしないようにする唯一の方法は、多数の非同期リロードをハード コーディングすることです。リロードの回数が多すぎて、フリーズ状態になります。言うまでもなく、私はこの解決策に問題を抱えています。少なくとも、ひどい慣習に思えます。
コードには、[PlacesFactQuery startTheActions] への呼び出しが含まれています。これは事実に基づく API を起動するだけで、場所のグローバル配列を設定するのに十分な座標に対して十分な呼び出しを行います。
Places.m は、グローバル配列に 0 を超えるポイントが含まれているかどうかをチェックします。その時点で、セルへの入力が開始されます。
これがプレイスコードです。一定数の非同期カウントをハードコーディングせずに、フリーズせずにこのデータをリロードする方法に関する推奨事項は、非常に役立ちます。
Places.h
#import <UIKit/UIKit.h>
#import <FactualSDK/FactualAPI.h>
#import <FactualSDK/FactualQuery.h>
@interface Places : UIViewController <UITableViewDataSource, UITableViewDelegate> {
NSTimeInterval *requestStartTime;
}
@property (nonatomic, retain) IBOutlet UITableView *tableView;
@property (nonatomic, retain) NSMutableDictionary* prefs;
@property (strong,retain) FactualQueryResult* queryResult;
@property (nonatomic, retain) FactualAPIRequest* activeRequest;
@property (strong, retain) NSMutableArray *tokenAndSourceAndNorthAndSouthBounds;
@property (strong, retain) NSMutableArray *placesInCorridor;
@property (assign, nonatomic) bool diagMode;
@property (nonatomic, assign) int numLoads;
@end
Places.m
#import "Places.h"
#import "Storage.h"
#import "QueryPreferences.h"
#import "PlacesFactQuery.h"
#import "PlacesDiag.h"
@implementation Places
-(id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
self = [super initWithNibName:nil bundle:nil];
if (self)
{
self.title = @"Places in Corridor";
self.diagMode = false;
}
self.numLoads = 0;
return self;
}
- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
if ([self respondsToSelector:@selector(edgesForExtendedLayout)]) {
[self setEdgesForExtendedLayout:UIRectEdgeBottom];
}
//[self loadDiagnostic];
}
- (void) viewDidLoad
{
PlacesFactQuery *placesFactQuery = [[PlacesFactQuery alloc] init];
[placesFactQuery startTheActions];
}
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
return 1;
}
- (NSInteger)tableView:(UITableView *)tableView
numberOfRowsInSection:(NSInteger)section
{
if (self.diagMode)
{
return 5;
} else {
if ([globalPlacesInCorridor count] > 0)
{
return [globalPlacesInCorridor count];
}else
{
return 1;
}
}
}
- (UITableViewCell *)tableView:(UITableView *)tableView
cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
tableView.dataSource = self;
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell"];
if(cell == nil) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue2 reuseIdentifier:@"Cell"];
}
if (self.diagMode)
{
cell.detailTextLabel.text = @"test";
cell.detailTextLabel.numberOfLines = 1;
} else {
if ([globalPlacesInCorridor count] > 0)
{
NSArray *arrayForInfo = [[NSArray alloc] initWithArray:globalPlacesInCorridor[indexPath.row]];
cell.detailTextLabel.text = [NSString stringWithFormat:@"%@\n%@\n%@\n%@",
arrayForInfo[0], arrayForInfo[4], arrayForInfo[5],
arrayForInfo[6]];
cell.detailTextLabel.numberOfLines = 5;
} else
{
cell.detailTextLabel.text = @"Please Wait...";
cell.detailTextLabel.numberOfLines = 1;
}
if (self.numLoads < 500)
{
dispatch_async(dispatch_get_main_queue(), ^{
[tableView reloadData];
});
self.numLoads++;
}
}
return cell;
}
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
return 100.0f;
}
-(void) loadDiagnostic
{
PlacesDiag *placesDiag = [[PlacesDiag alloc] initWithNibName:nil bundle:nil];
if ([globalPlacesInCorridor count] > 0)
{
placesDiag.placesList = globalPlacesInCorridor;
}
if ([globalPlacesAll count] > 0)
{
placesDiag.placesAll = globalPlacesAll;
}
[self.navigationController pushViewController:placesDiag animated:YES];
}
@end