2010-10-11 30 views
1
獲得控制權交還給

能否請你告訴我,我怎樣才能控制從NSOperationQueue如何從NSOperationQueue

以下是我真正的問題,我剛纔問:

喜的朋友,我做它起着應用點擊藝術家形象的歌曲(見附圖)。每個藝術家圖像都是在按鈕上實現的,點擊此按鈕時,會首先調用一個函數,然後播放該歌曲。我在一個線程中傳遞了這個方法(函數),但問題是每當我點擊藝術家的圖像(按鈕)時,新線程開始運行,然後多個歌曲開始同時播放。如何使用「NSOperation和NSOperationQueue」,以便一次只能播放一首歌曲。請幫忙。

alt text 預先感謝

現在我能夠通過隊列將其添加到播放歌曲,但歌曲開始播放的時間,直到歌曲結束我不是能在我的屏幕上做任何事情,或者我滾動表。

+1

這對我們來說太簡單了。你可以添加更多的細節? – zoul 2010-10-11 13:40:19

+0

@ Zoul:現在請告訴我 – Developer 2010-10-11 13:48:50

+0

我想你會在執行下載的操作中開始播放歌曲嗎?如果是這樣,那就是問題所在。只需要操作下載數據,然後將數據提供給通用的第三個對象 - 委託人 - 實際管理歌曲的開始/停止/暫停。 你的問題仍然有點含糊:你是下載整首歌還是流媒體?你使用什麼「球員」? AV框架,OpenAL或音頻隊列服務(上次我檢查,它是一個PITA)? Etcetera ... – sigsegv 2010-10-11 14:46:24

回答

0

讓主線程只排隊一條消息。讓線程執行操作(播放歌曲)將消息發送回主線程,指示何時完成。不要在主線程中排隊任何新的操作,直到主線程收到這個消息(有狀態)。

如果使用主線程方法上的執行選擇器將消息發回給主線程,那麼您的主線程將得到控制權。

+0

@:hotpaw2。我已經做到了。這是我的主要方法。 (void)main { \t NSLog(@「Added」); \t song = [[NSData dataWithContentsOfURL:tempURL] retain]; songPreview = [[AVAudioPlayer alloc] initWithData:song error:nil]; \t [songPreview setDelegate:self]; \t [objMainViewScreen performSelectorOnMainThread:@selector(playPreviewMethod)withObject:nil waitUntilDone:NO]; } – Developer 2010-10-11 15:56:08

+0

你的鎖在哪裏以防止再次調用此方法? – hotpaw2 2010-10-11 22:54:39

+0

爲什麼我需要鎖定?如果我在第一次點擊時鎖定此功能,那麼我將無法在第二次點擊時調用此功能,這意味着我的應用程序將掛起,直到第一次點擊完成下載,或者應用程序可能開始一起播放多首歌曲。 – Developer 2010-10-13 11:29:01