Итак, у меня есть этот метод, который запускается при загрузке рассматриваемого контроллера представления. Однако, если поток, в котором он запущен, инициируется более чем в 3 раза, приложение аварийно завершает работу. Мне нужно убедиться, что в потоке одновременно работает только один экземпляр метода, как мне это сделать, насколько я знаю, у этого способа запуска потока нет имени объекта потока, которое нужно проверить.
- (void)observeNowPlaying{
[self performSelectorInBackground:@selector(changeSongValues) withObject:nil]; //run the song checker in the background
}
-(void)changeSongValues{
while(threadX != 1){
MPMediaItem *tempItem = musicController1.nowPlayingItem; //set up now playing
checkingSong = tempItem.title;
NSString *artist = tempItem.artist;
checkingSong = [[NSString alloc]initWithFormat:@"%@ - %@",(artist.length>0 ? artist : @"Unknown"),(checkingSong.length>0 ? checkingSong : @"Unknown")];
_SongPlaying.text = checkingSong; //this changes the currently playing song and stuff
usleep(5);
}
}
Никогда не вызывайте performSelectorInBackground. Используйте GCD. Используйте последовательную очередь. Сделанный.
хорошо, очень полезно, не могли бы вы дать мне ссылку на то, как это сделать?
Я вижу ряд проблем. Как уже упоминалось, GCD - гораздо лучшее решение для многопоточности. Но опубликованный вами код выглядит так, как будто вы пытаетесь обновить пользовательский интерфейс на основе nowPlayingItem
. Если это так, то это совершенно неправильное направление. Во-первых, вы никогда не сможете Когда-либо обновлять пользовательский интерфейс в фоновом потоке; вероятно, поэтому он рушится. И не голосование. Создайте наблюдатель KVO для nowPlayingItem
и выполняйте код обновления пользовательского интерфейса всякий раз, когда он действительно изменяется.
да. Вместо этого я стал использовать уведомления
На самом деле, спасибо за подробности, потому что вы только что решили еще одну проблему, которая у меня возникла в связи с обновлением сведений пользовательского интерфейса фоновым потоком.た し こ ま り ま し た。
Никогда не спать. Никогда не спать. Никогда не спать.