如何使用数据快速优化代码和加载 UIPickerView?

Posted

技术标签:

【中文标题】如何使用数据快速优化代码和加载 UIPickerView?【英文标题】:How to optimize code and load UIPickerView with data fast? 【发布时间】:2014-07-17 05:44:40 【问题描述】:

我正在创建包含 2 个组件的 UIPickerView,时间分别为几分钟和几秒钟。我在 UI 中创建了选择器并希望用数据填充它,下面是我如何用 0 - 59 的数字填充它的代码。我想让它看起来像圆形,这就是 kSizeOfPicker 为 60000 的原因。当用户按下按钮窗口时选择器出现,但它非常减慢应用程序,因为这 代码在 viewDidLoad 中。我该如何解决?

NSString *stringValue = [[NSString alloc] init];

for(int i=0; i<kSizeOfPicker; i++)

    stringValue = [NSString stringWithFormat:@"%d", i%60];


    [_minutesArray addObject:stringValue];
    [_secondsArray addObject:stringValue];

这里是数据源和委托方法:

#pragma mark - UIPickerView DataSource Methods


- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView

return 2;



- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent :    (NSInteger)component


if (component==0)

    return [_minutesArray count];

else

    return [_secondsArray count];

- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component

NSString *title;
switch (component)


    case 0:
        title = [NSString stringWithFormat:@"%@ minutes", [_minutesArray objectAtIndex:row]];

        return title;
        break;
    case 1:
        title = [NSString stringWithFormat:@"%@ seconds", [_secondsArray objectAtIndex:row]];
        return title;
        break;

return nil;


#pragma mark - UIPickerView Delegate Methods

- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component

if (component == 0)
    _firstComponent = [_minutesArray objectAtIndex:row];

else
    _secondComponent = [_secondsArray objectAtIndex:row];


【问题讨论】:

我认为 60000 次迭代是瓶颈。你能实现循环选择器吗?如果可能的话,您能否粘贴您的 UIPickerView 委托和数据源实现代码? @NagaMalleshMaddali 添加了 【参考方案1】:

您不需要准备 NSArray 中的所有数据来归档循环选取器视图。 以下代码实际上在所选行周围准备了 +-50 个重复数据集。 在pickerView:didSelectRow:inComponent: 委托方法中,您可以重置选定的行。

@interface MyViewController () <UIPickerViewDataSource, UIPickerViewDelegate>
@property (weak, nonatomic) IBOutlet UIPickerView *pickerView;
@property (assign, nonatomic) NSUInteger minutes;
@property (assign, nonatomic) NSUInteger seconds;
@end

@implementation MyViewController

#define VALUE_THRESHOLD 60
#define PICKER_DUPLICATES 100
#define CENTER_ROW (VALUE_THRESHOLD * PICKER_DUPLICATES / 2)

- (void)viewDidLoad 
    [super viewDidLoad];
    [_pickerView selectRow:_minutes + CENTER_ROW inComponent:0 animated:NO];
    [_pickerView selectRow:_seconds + CENTER_ROW inComponent:1 animated:NO];


- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView 
    return 2;


- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component 
    return VALUE_THRESHOLD * PICKER_DUPLICATES;


- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component 
    return [NSString stringWithFormat:@"%d", row % VALUE_THRESHOLD];


- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component 
    NSInteger actualRow = row % VALUE_THRESHOLD;

    // reset to center dataset
    [pickerView selectRow: actualRow + CENTER_ROW inComponent:component animated:NO];

    // do anything what you want;
    if(component == 0) 
        _minutes = actualRow;
    
    else 
        _seconds = actualRow;
    


@end

【讨论】:

【参考方案2】:

使用 UIDatePicker 而不是 60000 次迭代,它会让您的生活更轻松。将其mode 设置为Time

【讨论】:

【参考方案3】:

如果问题是由于数据量大而导致的加载时间问题,那么您可以将这些代码放入视图中,或者您可以将代码放入 Dispatch queue 中,它不会阻塞您的主线程并让您的屏幕快速加载。

dispatch_async(dispatch_get_global_queue( DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(void)
    //Background Thread
    // here you can do your heavy operation 
    dispatch_async(dispatch_get_main_queue(), ^(void)
        //Update your UI
    );
);

或者,如果您只想显示时间,则可以使用 UIDatePicker 并设置其模式:

日期选择器模式 日期选择器的模式。

typedef enum 
   UIDatePickerModeTime,
   UIDatePickerModeDate,
   UIDatePickerModeDateAndTime,
   UIDatePickerModeCountDownTimer
 UIDatePickerMode;

希望对你有所帮助。

谢谢。

【讨论】:

以上是关于如何使用数据快速优化代码和加载 UIPickerView?的主要内容,如果未能解决你的问题,请参考以下文章

SPA页面性能优化

使用策略模式优化代码实践,如何让项目快速起飞

Java代码如何优化

技术分享 InnoDB Cluster 如何高效加载数据

如何在 R 中分析和优化已经快速的代码

如何优化 webpack/es6 开销?