Ik ervoer dezelfde trage prestaties met modale weergavepresentaties. Ik kwam tot een oplossing door wat geheugen op te offeren ten gunste van de prestaties.
BACKGROUND:
My app was using the Model-View-Controller-Store model. The Store was a singleton which was taking care of my model, hence it was virtually accessible from any of my classes once it was instantiated. I was using the Store class to keep around certain expensive classes (such as NSCalendar, NSDateFormatter etc) through properties.
SOLUTION:
I crated a UIDatePicker property in the Store singleton, which allowed it to be accessed through any class.
In de interface van de Singleton:
@property (strong, nonatomic) UIDatePicker *datePicker;
Bij de implementatie van de Singleton heb ik een getter voor de datePicker geïmplementeerd.
- (UIDatePicker *)datePicker
{
if (!_datePicker) {
_datePicker = [[UIDatePicker alloc] init];
}
return _datePicker;
}
Hierdoor is datePicker slechts één keer gemaakt en is het overal in mijn app toegankelijk.
Nu in de viewDidLoad-methode van de klasse waar u de picker zou moeten gebruiken, haalt u de eigenschap op via de methode getter:
UIDatePicker *aDatePicker = [[MySingleton shareInstance] datePicker];
// Set it's location.
[aDatePicker setFrame:CGRectMake(0.0, 236.0, self.view.frame.size.width, 216.0)];
// Connect to any actions
[aDatePicker addTarget:self action:@selector(datePickerValueChanged:) forControlEvents:UIControlEventValueChanged];
// Add it to you view
[self.view addSubview:[[MySingleton shareInstance] datePicker]];
Het trage gedrag gebeurt voor de eerste keer wanneer de datumkiezer wordt gemaakt. Elke andere keer zal de modale weergave razendsnel verschijnen (afhankelijk van wat je nog meer had in de weergave).
In wezen was ik bezig een globale variabele te maken en die bij te houden zodat ik deze niet elke keer hoefde te maken, ten koste van het geheugen. Het prestatieverschil maakte het de moeite waard in mijn apps-hoesje.
NOTE:
There is one caveat to watch for though. Since the datePicker will most likely outlive the modal view, it is imperative to make sure that the datePicker is not pointing to any deallocated memory.
Dus als "self" is toegewezen als doel in viewDidLoad:
[aDatePicker addTarget:self action:@selector(datePickerValueChanged:) forControlEvents:UIControlEventValueChanged];
Het is belangrijk dat in een methode zoals viewDidDisappear deze code toe te voegen om een crash te voorkomen:
[aDatePicker removeTarget:self action:@selector(datePickerValueChanged:) forControlEvents:UIControlEventValueChanged];