0

我發現有幾個post詢問如何運行後臺任務。這可以。我知道了。有一個來自Apple的guideline,只能爲特定類型的應用程序完成。iOS:僅當APP處於活動狀態時纔會重複執行任務(無背景)

我的使用案例如下:我只想在APP在前臺時更新聊天App的聯繫人列表。因此,當應用程序分別處於以下狀態時,我可以開始/暫停/繼續:didBegan,didEnterBackground,didResumeFromBackground。

如何使用GCD實現這一目標?

換句話說,我怎樣才能以重複的方式安排異步任務,並且每隔一段時間纔會被調用一次(比如每0.5秒)?使用NSOperationQueue有沒有很好的實現?

編輯2:任務我想執行:

1:從GET:從web服務API含有上的觸點

2信息(在線狀態,設備,在lastseen)一個JSON數據對象GET一個web服務API一個包含消息給用戶的JSON數據對象

編輯:NSOperation文檔定義的操作只能用作「單次鏡頭」,因此創建遞歸操作可能不是解決此問題的最佳方法。

+1

咦?遞歸操作?您可以使用塊創建操作,其行爲與分派隊列完全相同。 –

+0

@LeoNatan我在評論中看到你的觀點。我會嘗試你的方法。所以基本上NSTimer對象只有在應用程序處於前景而不在後臺時執行,並且它們自己的內部恢復/暫停方法正確嗎? – mm24

+1

是的。當應用程序進入後臺時,定時器被暫停。當它返回到前臺時,定時器恢復,任何到期的定時器將會觸發。對此的一個警告是,您的應用可能會在後臺中喚醒(例如推送)。在應用程序運行時,定時器也在後臺運行。 –

回答

3

下面是一些關於如何使用計時器以及GCD和操作隊列來實現此目標的代碼。

NSOperationQueue* queue = [NSOperationQueue new]; 
[queue setMaxConcurrentOperationCount:1]; //Make serial. 
//dispatch_queue_t queue = dispatch_queue_create("queue", NULL); //Serial queue. 

先生們,開始你的計時器:

[NSTimer scheduledTimerWithTimeInterval:0.0 target:appDelegate selector:@selector(timerTicked:) userInfo:nil repeats:NO]; //Start a timer with 0 so it ticks immediately. 

現在的方法:

- (void)timerTicked:(NSTimer*)timer 
{ 
    NSLog(@"Timer ticked!"); 
    void (^block)() = ^{ 
     //Do what you need here. 

     //Start a new timer. 
     [NSTimer scheduledTimerWithTimeInterval:1.0 target:appDelegate selector:@selector(timerTicked:) userInfo:nil repeats:NO]; 
    }; 

    [queue addOperationWithBlock:block]; 
    //dispatch_async(queue, block); 
} 

我使用應用程序的委託,因爲計時器保留目標對象,所以我不希望將其放入視圖控制器中。您可以在計時器滴答後或操作/任務完成後立即計劃下一個計時器,這正是我喜歡做的。

+1

非常棒。非常感謝。對不起,重複的問題和評論:-)。希望我可以給+5 upvotes,因爲它非常有用。 – mm24

+0

@ mm24不用擔心,祝你好運 –

1

使用NSTimer計劃每隔0.5秒觸發的計時器。它可以將你的NSOperation添加到NSOperationQueue中。您可能希望創建一個最大併發數爲1的特殊隊列,因此它一次只能運行您的一件事情。在添加新的操作時,您可能還想取消所有之前的操作,以防事情開始「堆積」。我不知道你的具體任務是什麼,所以很難更精確。

+0

太棒了。這聽起來不錯。我會馬上嘗試。 – mm24

+0

@ mm24關於定時器的一個字。如果將計時器設置爲重複計時,則可能會在後臺發生不良後果,計時器可能會多次觸發(發生次數有機會運行的次數)。更好的方法是將計時器安排爲不重複,並且在舊計算器的處理程序完成其任務後安排新計時器。 –

+0

@jsd我在答案中加入了一個特定用例 – mm24

相關問題