2010-12-03 2 views
0

Я пытаюсь ускорить работу приложения, выполняя вычисления в фоновом режиме, но у меня возникают проблемы с этим. Первоначально я использовалВыполнить метод С int Возвращаемое значение в фоновом потоке

[self performSelectorInBackground:@selector(calculateValue:) withObject:[words objectAtIndex:row]]; 

, который был прекрасен, когда мой селектор был недействительным. Тем не менее, я пытаюсь сделать что-то подобное, но, очевидно, приведенный ниже код недействителен.

int value = [self performSelectorInBackground:@selector(calculateValue:) withObject:[words objectAtIndex:row]]; 

Любая помощь очень ценится.

Обновлено

Вот маршрут я в настоящее время идет. Я не знаю, как назвать обратно в основной поток, чтобы отправить обновленное значение из computeWordValue моей cellForRowAtIndexPath

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    int value = [self performSelectorInBackground:@selector(calculateWordValue:) withObject:[wordsSection objectAtIndex:row]]; 
    NSString *pointValue = [[NSString alloc] initWithFormat:@"Point:%d",value]; 
    cell.pointLabel.text = pointValue; 
} 

-(void)calculateWordValue:(NSString *)word { 

    [self performSelectorOnMainThread:@selector(computeWordValue:) withObject:word waitUntilDone:YES]; 
} 

-(int)computeWordValue:(NSString *)word { 

    return totalValue; //This will be a randomly generated number 
} 
+0

Насколько быстрым/медленным является `calculateWordValue` и почему вы пытаетесь запустить его в фоновом режиме в этой точке? – 2010-12-03 16:03:21

+0

Он выполняет множество расчетов, я просто упростил его для публикации – aahrens 2010-12-03 16:19:24

ответ

1

Heres путь я использую, чтобы сделать это:

-(void) calculateValue:(id) obj 
    { 
     // calculate value 
     [self performSelectorOnMainThread:@selector(didFinishCalculating:) withObject:[NSNumber numberWithInt:value]]; 
    } 

-(void) didFinishCalculating:(NSNumber *) val 
{ 
     // do what you need to do here 
} 

Это действительно Безразлично» Решить вашу проблему я не думаю, но она должна хотя бы дать вам отправную точку.

UPDATE:

Ваш новый код показывает мне, что вы на самом деле не нужно выполнять это в фоновом режиме, просто кэшировать значение, используя NSDictionary или что-то. Вот пример:

-(int) calculateValue:(id) obj 
{ 
     if ([valuesCache objectForKey:obj] == nil) 
     { 
      // calculate value 
      [valuesCache setObject:[NSNumber numberWithInt:result] forKey:obj]; 
      return result; 
     } 
     else 
     { 
      return [[valuesCache objectForKey:obj] intValue]; 
     } 
} 
1

Там нет никакого способа -performSelectorInBackground: ... может возвращать значение методы вы звоните, потому что на самом деле возвращает перед селектором даже казнен. Этот селектор будет выполнен в фоновом потоке как можно скорее.

Решение обработки результат вашего метода асинхронно, так как Ричард указал (метод в своем ответе должен быть - (void)didFinishCalculating:(NSNumber*)val, потому что только объекты могут быть переданы в -performSelector: ... вызовов):

  • Выполнить свой селектор на фоновая нить
  • Вызовите метод обработчика результатов в основном потоке. Вы должны сделать это в основном потоке практически в любом случае, потому что некоторые вещи в Mac OS X и iOS предназначены для запуска только в основном потоке, например обновления графического интерфейса пользователя.
Смежные вопросы