2011-12-19 14 views
0

私の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 
+0

loadNewDataとは何ですか?そのコードを私たちに与えてください。 – vikingosegundo

+0

私はちょうどそれが本当に何かのメソッドのように何かのように見える問題を見つけると思う - insertNewDataまたはloadNewDataのいずれかがまだ何が起こっているか把握することはできません。 あなたはおそらく正しいです! – e2l3n

答えて

1
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL: [NSURL URLWithString:urlStr]]; 
NSData *dataReply = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error]; 

問題があり、両方のメソッドのコードです。

これは、要求が完了するまで、UIが完全にブロックされることを意味します。
これは非同期で行う必要があります。 StackOverflowにはたくさんのコードがあります。

+0

ありがとうございます! – e2l3n