Your data source and delegate methods can get called any number of times - that is not a problem.
You should assume that methods:
- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component;
or
- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component;
can be called at any time and several times. Thus the implementation of it should be lightweight. Move the fetching code elsewhere - e.g. to viewDidLoad
. So you only fetch once. Then when the picker requests information from its delegate, it does not result in performing a not needed fetch.