私のiPhoneアプリケーションでは、更新ボタンを押すと新しいサブビューが追加されます。この新しいビューは画面全体をカバーし、更新操作が完了するまではテーブルビューにアクセスできません。実際にはアイデアですが、私はその実現に次の問題があります。ビューがゆっくりと表示され、ポップアップするのに2,3秒かかります。ビューの読み込みが遅すぎる
私は、新しいスレッドを開始して同期させることができると考えましたが、これがまったく役立つかどうかはわかりません。
- (IBAction) updateButtonPressed: (id)sender {
self.updateButton.enabled = NO;
//HERE STARTS THE LOADING VIEW
LoadingView * loadingView =[LoadingView initializeLoadingView:[self.view.window.subviews objectAtIndex:0]];
//HERE STARTS THE LOADING VIEW
[self deleteData];//delete old data
[self insertNewData];
[self loadNewData];
//THE LOADING VIEW IS DISMISSED
[loadingView dismissView];
//THE LOADING VIEW IS DISMISSED
self.updateButton.enabled = YES;
}// updateButtonPressed
アクションが開始された後すぐにビューが表示されます。そうでないと、プログラム全体のロジックが地獄になります。
EDIT
:ここ では、メインスレッド上で同期のネットワーク要求を実行していること、insertNewDataとloadNewData- (void) insertNewData
{
NSString *urlStr;
NSError *error;
NSURLResponse *response;
if(self.title == @"New York")
{
urlStr =[[NSString alloc] initWithFormat: @"http://api.wunderground.com/auto/wui/geo/ForecastXML/index.xml?query=New_York,IL"];
}
else
urlStr = [NSString stringWithFormat:@"http://api.wunderground.com/auto/wui/geo/ForecastXML/index.xml?query=%@,IL",self.title];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL: [NSURL URLWithString:urlStr]];
NSData *dataReply = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];
xmlControl = [[XMLController alloc] loadXMLbyData:dataReply];
Forecast *forecast;
for(ForecastPeriod *newForecast in [xmlControl weatherForecasts])
{
forecast = [[Forecast alloc] initWithEntity:[NSEntityDescription entityForName:@"Forecast" inManagedObjectContext:self.managedObjectContext] insertIntoManagedObjectContext:self.managedObjectContext];
[forecast setValue:newForecast.conditions forKey:@"conditions"];
[forecast setValue:newForecast.day forKey:@"day"];
[forecast setValue:newForecast.icon forKey:@"icon"];
[self addImagesAtSpecificDirectory:newForecast.icon];
[forecast setValue:newForecast.max forKey:@"max"];
[forecast setValue:newForecast.min forKey:@"min"];
[forecast setValue:newForecast.month forKey:@"month"];
[forecast setValue:newForecast.period forKey:@"period"];
[forecast setValue:newForecast.weekday forKey:@"weekday"];
[forecast setValue:newForecast.year forKey:@"year"];
[forecast setValue:self.title forKey:@"location"];
}
if (![self.managedObjectContext save:&error]) {
NSLog(@"Couldn't save: %@", [error localizedDescription]);
}
}//insertNewData
- (void) loadNewData
{
AppDelegate *appDelegate = (AppDelegate*) [[UIApplication sharedApplication] delegate];
NSManagedObjectContext *managedObjectContext = appDelegate. managedObjectContext;
NSFetchRequest *request = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Forecast" inManagedObjectContext:managedObjectContext];
[request setEntity:entity];
NSSortDescriptor *sortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"period" ascending:YES];
[request setSortDescriptors:[NSArray arrayWithObject:sortDescriptor]];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"location = %@",self.title];
[request setPredicate:predicate];
NSError *error;
NSMutableArray *mutableFetchResults = [[managedObjectContext executeFetchRequest:request error:&error] mutableCopy];
self.items = mutableFetchResults;
[self.tableView reloadData];
[mutableFetchResults release];
[request release];
//iPad
if ([[UIDevice currentDevice] userInterfaceIdiom]==UIUserInterfaceIdiomPad && popOver_ != nil)
{
[popOver_ dismissPopoverAnimated:YES];
}
}//loadNewData
が
loadNewDataとは何ですか?そのコードを私たちに与えてください。 – vikingosegundo
私はちょうどそれが本当に何かのメソッドのように何かのように見える問題を見つけると思う - insertNewDataまたはloadNewDataのいずれかがまだ何が起こっているか把握することはできません。 あなたはおそらく正しいです! – e2l3n