2011-03-22 17 views
0

經過過去幾天的大量編碼之後,我終於(很)卡住了。第二次發生某種情況或超時後調用某種方法,以先到者爲準

我的應用程序偵聽由iTunes發送的外部NSNotification。只要當前播放狀態發生變化,通知就會發送出去,在這種情況下,當前流標題發生變化時最有意思。當你連接到一個新的電臺時,兩個通知通常發送 - iTunes連接一個,電臺名稱作爲標題,一個很快(一秒左右)與實際的藝術家和標題的當前歌曲。我只對藝術家/標題組合或第二張通知感興趣。 ,如果在兩秒鐘的暫停後仍然只發送一個通知,請使用第一個通知。 (由於沒有辦法知道是否會有一兩個事先,超時是我能想到的唯一方法。)

用更少的詞,我想調用一個方法只有第二次發生的情況,或者如果只發送一個通知,則在兩秒超時後。在兩秒鐘後,它應該重新設定完成整個交易。

任何想法?

回答

1

這不是太複雜。您只需要堅持第一個通知,直到定時器觸發或第二個通知進入。我在代碼中的註釋應解釋過程。

- (void)awakeFromNib { 
    // Register for the notification you're interested in 
    [[NSDistributedNotificationCenter defaultCenter] addObserver:self 
                 selector:@selector(iTunesNoteCallback:) 
                  name:NSTheiTunesNotificationImInterestedIn 
                  object:nil]; // @"iTunes"? 
} 

- (void)iTunesNoteCallback:(NSNotification *)note { 
    // Check whether there's been a notification already 
    if(!gotFirstNote){ 
     // If so, hang on to it, 
     gotFirstNote = YES; 
     self.currNote = note; // With currNote declared as a retained property 
     // and start a timer. 
     noteTimer = [NSTimer scheduledTimerWithTimeInterval:2.0 
                target:self 
                selector:@selector(actOniTunesInfo:) 
                userInfo:nil repeats:NO]; 
    } 
    else { 
     // However, if we got a notification already, 
     // hang on to the new one, 
     self.currNote = note; 
     // stop the timer, 
     [noteTimer invalidate]; 
     // and call the same method the timer would have 
     [self actOniTunesInfo:nil]; 
    } 
} 

- (void)actOniTunesInfo:(NSTimer *)timer { 
    // Reset the flag 
    gotFirstNote = NO; 
    // Use currNote; doesn't matter which one it is, 
    // it's the best info we've gotten 
} 

如果有兩個類型的通知,這是更簡單。您不再需要該標誌,只需註冊兩個回調,一旦第二個回調被調用,您就可以使計時器無效,釋放第一個通知,並使用剛剛獲得的信息。

+0

謝謝。由於相對簡單,我非常喜歡這個解決方案。 (由於線程,定時器有點棘手。) – exscape 2011-03-23 15:27:52

0

您需要創建一個數據模型,可以存儲和建模通知以及它們的順序和時間。

首先,您需要一個數據對象來存儲有關通知的每個通知和數據。 - 通知對象 - 時間戳當通知到達 - 通知

那麼你就需要一個容器對象,可容納在一個陣列,以及啓動和捕捉定時器的數據對象類型。所以,當通知到達時,它會被分類,存儲在一個數據對象中,然後被壓入數組中。如果它是第一種類型的通知,則容器對象啓動兩秒鐘的計時器。如果第二種類型的另一個通知到達,容器對象將殺死定時器,但是如果定時器觸發,則返回超過兩秒鐘的最後一個第一類型通知的數據對象。

觸發某個操作後,清空容器對象並重新開始。

+0

在我看來,這似乎是過度設計解決方案。您可以直接保留通知對象;如果你已經有一個,只需使用新的。 – 2011-03-22 22:07:07

+0

什麼確切的對象將直接保留通知對象?你只是想把它塞進隨機控制器的某個地方嗎?您是否需要僅在應用程序的位置訪問通知,或者您需要訪問多個訪問點?在這種情況下,通知包含數據並與它們的順序和時間相結合,成爲數據模型邏輯的一部分。根據我的經驗,它可以節省時間將這些數據封裝在某種專用對象中。那麼你有它,不必擔心從那時起。你可以將數據對象插入到任何地方的應用程序,它會工作。 – TechZen 2011-03-23 00:44:25

相關問題