Как я могу оптимизировать этот цикл? - PullRequest
0 голосов
/ 26 декабря 2010

У меня есть фрагмент кода, который возвращает сверхдлинную строку, которая представляет «результаты поиска».Каждый результат представлен двойным символом разрыва HTML.Например:

Результат1

Результат 2

Результат3

У меня есть следующий цикл, который принимает каждый результат и помещаетэто в массив, убрав индикатор разрыва, "kBreakIndicator" (

).Проблема в том, что выполнение этого lopp занимает слишком много времени.С несколькими результатами это нормально, но как только вы достигнете сотни результатов, это будет примерно на 20-30 секунд медленнее.Это недопустимое исполнение.Что я могу сделать, чтобы улучшить производительность?

Вот мой код:

content - исходная строка NSString.

  NSMutableArray *results = [[NSMutableArray alloc] init];

  //Loop through the string of results and take each result and put it into an array
   while(![content isEqualToString:@""]){
   NSRange rangeOfResult = [content rangeOfString:kBreakIndicator];
   NSString *temp = (rangeOfResult.location != NSNotFound) ? [content substringToIndex:rangeOfResult.location] : nil; 
   if (temp) {
    [results addObject:temp];
    content = [[[content stringByReplacingOccurrencesOfString:[NSString stringWithFormat:@"%@%@", temp, kBreakIndicator] withString:@""] mutableCopy] autorelease];
   }else{
    [results addObject:[content description]];
    content = [[@"" mutableCopy] autorelease];
   }
  }
//Do something with the results array.
[results release];

Ответы [ 2 ]

3 голосов
/ 26 декабря 2010

Что вы можете сделать, так это сначала использовать NSString componentsSeparatedByString: метод, который даст вам NSArray, например:

РЕДАКТИРОВАТЬ: Предполагая, что ваша kBreakIndicator константа <br>:

NSArray *temp_results = [content componentsSeparatedByString:kBreakIndicator];
NSMutableArray *results = [[NSMutableArray alloc] init];
for(NSString *result in temp_results) {
   if(result.length == 0) continue;
   [results addObject:result];
}
//do something with results...
[results release];

Результат ответа @ инварианта : http://cl.ly/3Z112M3z3K1V2t0A3N2L

Результат моего ответа : http://cl.ly/371b2j2H0Y1E110D2w0I

Если ваша kBreakIndicator константа равна <br><br>:

NSArray *result = [content componentsSeparatedByString:kBreakIndicator];
2 голосов
/ 26 декабря 2010

Это должно сделать это:

NSArray *results = [content componentsSeparatedByString:@"<br><br>"];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...