调用方法9次,应调用一次

时间:2013-07-10 20:21:03

标签: objective-c cocoa-touch

我正在为iOS编写一个表格视图应用程序,我正在实现天气。

在我的第一部分(第0部分)中,我有9行(0-8)的基本数据。

-(NSArray *)currentDataValues
{
    return @[
         [self dataValueForKey:@"cloudCover"],
         [self dataValueForKey:@"dewPoint"],
         [self dataValueForKey:@"humidity"],
         [self dataValueForKey:@"precipIntensity"],
         [self dataValueForKey:@"precipProbability"],
         [self dataValueForKey:@"temperature"],
         [self dataValueForKey:@"visibility"],
         [self windDirection:[self.currentValuesDict valueForKey:@"windBearing"]],
         [self dataValueForKey:@"windSpeed"]];
}

然后在我的cellForRowAtIndexPath中,我有以下内容。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    NSString *cellIdentifier;

    if (indexPath.section == 0) {
        cellIdentifier = @"Summary Cell";
    } else {
        cellIdentifier = @"Minutely Cell";
    }

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];

    if (!cell) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:cellIdentifier];
    }

    if([indexPath section] == 0){
        cell.textLabel.text = [self.currentDataPoints objectAtIndex:[indexPath row]];
        cell.detailTextLabel.text = [self.currentDataValues objectAtIndex:[indexPath row]];
    }

现在,一切正常。这些单元格就像它们期望的那样生成,并且它按照我设想的方式工作。

问题/问题。

正如你在currentDataValues方法中注意到的那样,我在某一点上调用另一个方法来返回Wind Direction,它看起来像这样(为简洁起见缩短了。)

-(NSString *)windDirection:(NSNumber *)value
{
    NSLog(@"%@", value);
    if (value.floatValue > 11.25 && value.floatValue < 33.75) {
        return @"North North East";
    } else if (value.floatValue > 33.75 && value.floatValue < 56.24) {
        return @"North East";
    }
}

我已经在那里登录进行测试,其中存在问题。当调用该方法时,我得到9条日志消息,而我只能得到1。

2013-07-10 16:19:13.502 XX Weather[48831:c07] 260
2013-07-10 16:19:13.503 XX Weather[48831:c07] 260
2013-07-10 16:19:13.503 XX Weather[48831:c07] 260
2013-07-10 16:19:13.503 XX Weather[48831:c07] 260
2013-07-10 16:19:13.504 XX Weather[48831:c07] 260
2013-07-10 16:19:13.504 XX Weather[48831:c07] 260
2013-07-10 16:19:13.504 XX Weather[48831:c07] 260
2013-07-10 16:19:13.505 XX Weather[48831:c07] 260
2013-07-10 16:19:13.505 XX Weather[48831:c07] 260

我必须假设这会导致性能问题,而且我不明白为什么会发生这种情况。

4 个答案:

答案 0 :(得分:8)

每次 cellForRowAtIndexPath调用currentDataValues方法时,都会创建该方法中的字典,因此调用windDirection

您应该创建该词典一次,例如在viewDidLoad中,并将其存储在表视图控制器的属性或实例变量中。

答案 1 :(得分:2)

为tableview尝试显示的每个项目调用-(NSArray *)currentDataValues方法(如果我理解正确,则为9)。在Objective-C中,“点”语法(例如您出现的self.currentValuesDict)实际上只是调用具有相同名称的方法的别名。它不会在引擎盖下执行任何缓存或花哨的行为。所以身体:

{
return @[
     [self dataValueForKey:@"cloudCover"],
     [self dataValueForKey:@"dewPoint"],
     [self dataValueForKey:@"humidity"],
     [self dataValueForKey:@"precipIntensity"],
     [self dataValueForKey:@"precipProbability"],
     [self dataValueForKey:@"temperature"],
     [self dataValueForKey:@"visibility"],
     [self windDirection:[self.currentValuesDict valueForKey:@"windBearing"]],
     [self dataValueForKey:@"windSpeed"]];
}

对这9次9次评估,包括你调用windDirection的行。您需要在表视图控制器的初始化中生成和缓存此数组,或者第一次调用currentDataValues

答案 2 :(得分:0)

您的方法“currentDataValues”每次调用时都会创建并返回一个新数组。因此,每次调用tableView:cellForRowAtIndexPath:时,它都会调用currentDataValues并构造并返回一个新数组。

答案 3 :(得分:0)

如果你希望你的方法只能在你做这样的事情后被调用。

.h文件:

@property (nonatomic, strong) NSArray *currentDataValues;   

.m文件:

{
  if (_currentDataValues == nil) {
    _currentDataValues = [self dataValueForKey:@"cloudCover"],
      [self dataValueForKey:@"dewPoint"],
      [self dataValueForKey:@"humidity"],
      [self dataValueForKey:@"precipIntensity"],
      [self dataValueForKey:@"precipProbability"],
      [self dataValueForKey:@"temperature"],
      [self dataValueForKey:@"visibility"],
      [self windDirection:[self.currentValuesDict valueForKey:@"windBearing"]],
      [self dataValueForKey:@"windSpeed"]]
  }
  return _currentDataValues;
}

使用currentDataValues的这个访问器,您的数组将只创建一次。