2013-08-28 7 views
2

Я разрабатываю приложение для iPhone, где я пытаюсь вызвать конкретный метод после определенной задержки. Но метод не вызван. Я понятия не имею, почему его не называют.self performSelector: withObject: afterDelay: не вызывает метод

Вот мой код

-(void)gettingCommentsList { // some stuff.... 

    [self performSelector:@selector(callGetListInBackgroundMethod) withObject:nil afterDelay:1.0]; } 

-(void)callGetListInBackgroundMethod { 
    isFromthread =YES; 


    NSLog(@"callGetListInBackground"); 
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 
     // Add code here to do background processing 
     // 
     // 

     [self gettingCommentsList]; 
     dispatch_async(dispatch_get_main_queue(), ^{ 
      // Add code here to update the UI/send notifications based on the 
      // results of the background processing 

      [self.commentsTbl reloadData]; 
     }); 
    }); 



} 

Благодаря

+0

Удерживайте клавишу Alt и наведите указатель мыши на метод, чтобы проверить, что метод идентифицирует или нет. В противном случае вызывайте как '[self performSelector: @selector (callGetListInBackgroundMethod :) withObject: nil afterDelay: 0.4];' – user1673099

+0

вы уверены, что 'performSelector: withObject: afterDelay:' на самом деле называется? – sergio

+0

Да, я уверен, что его получение называется – user2185354

ответ

0

Убедитесь, что вы не зовем [NSObject cancelPreviousPerformRequestsWithTarget: само]

+0

да Я не звоню – user2185354

2

Одна потенциальная проблема заключается в том, что таймеры не мешают темы от выхода до таймер уволен. Поэтому, если цикл выполнения (потока, который вызывает -performSelector:withObject:afterDelay:), не имеет другого источника (работы), он может не продолжать работать в течение одной секунды или более, и поток выйдет до того, как ваш таймер начнет работу (и ваша пользовательская работа будет выполнена).

Это, безусловно, возможно если вы планируете таймер на вторичной резьбе.

Я подозреваю, что причина этого дизайна заключается в том, что таймеры могут быть настроены как повторяющиеся (или нет) - многие люди получат потоки «зомби», потому что эти повторяющиеся таймеры никогда не будут признаны недействительными. Эта проблема может легко пережевать тонну системных ресурсов.

0

Вы, кажется, вызывая каждый метод с другой -

В gettingCommentList, вы звоните

[self performSelector:@selector(callGetListInBackgroundMethod) withObject:nil afterDelay:1.0]; 

и в callGetListInBackgroundMethod в dispatch_async вы звоните

[self gettingCommentList]; 

Edit:

Попробуйте сделать звонок только один раз и посмотреть, работает ли он. Если это так, возможно, вы не закончили с первым вызовом до начала второго, следовательно, проблема. Позвольте мне знать, что происходит.

Редакция 2:

Я пробовал свой код. Проблема состоит в том, что последующие вызовы getCommentList находятся в фоновом потоке, а не в основном потоке. Таким образом, я сделал это:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 
    // Add code here to do background processing 
    //   
    dispatch_async(dispatch_get_main_queue(), ^{ 
     [self gettingCommentsList]; 
    }); 
}); 

и он работает. Но убедитесь, что вы не вызываете две функции непрерывно, так как это заставляет их работать все время, что я уверен, что вы действительно не хотите :-)

+0

то, что я точно делаю, отправляет запрос с использованием мыла , И затем разбор ответа. После разбора я снова пытаюсь вызвать мыло, но в отдельном потоке, чтобы мое приложение не зависало. Но я хочу назвать мыло после определенного временного интервала – user2185354

+0

Я обновил свой пост. –

+0

Но мне нужен вызов метода getCommentsList в фоновом режиме. Если я вызову основной поток, мое приложение будет висеть – user2185354

Смежные вопросы