2012-05-24 37 views
14

我正在使用parse.com API(託管後端,它提供API以將數據保存在其服務器上)開發應用程序。我希望能夠無縫地在線和離線使用應用程序。 爲此,我需要使用一個隊列,可以放置需要網絡訪問的塊。當網絡變得可用時,塊應該被串行執行,並且當網絡脫機時,應該暫停隊列處理。ios:在後臺隊列塊並在網絡可用時執行

我正在考慮在網絡變得可用/不可用時使用帶暫停/繼續的GCD。 我想知道是否有更好的選擇?如果應用程序放置在後臺,這會工作嗎?這裏的例子是用戶在網絡不可用時(保存隊列)保存一些數據,然後將應用程序置於後臺。現在,當網絡可用時,是否可以自動在後臺進行保存?

回答

15

我確實在做你想要使用NSOperationQueue的目標。首先,創建一個串行隊列,默認情況下將其掛起:

self.operationQueue = [[[NSOperationQueue alloc] init] autorelease]; 
self.operationQueue.maxConcurrentOperationCount = 1; 
[self.operationQueue setSuspended:YES]; 

然後,創建可達性實例,並註冊了kReachabilityChangedNotification

[[NSNotificationCenter defaultCenter] addObserver:manager 
             selector:@selector(handleNetworkChange:) 
              name:kReachabilityChangedNotification 
              object:nil]; 

[self setReachability:[Reachability reachabilityWithHostName:@"your.host.com"]]; 
[self.reachability startNotifier]; 

現在,啓動和停止隊列當網絡狀態的變化:

-(void)handleNetworkChange:(NSNotification *)sender { 
    NetworkStatus remoteHostStatus = [self.reachability currentReachabilityStatus]; 

    if (remoteHostStatus == NotReachable) { 
     [self.operationQueue setSuspended:YES]; 
    } 
    else { 
     [self.operationQueue setSuspended:NO]; 
    } 
} 

你可以用你的排隊塊3210

暫停隊列只會阻止操作啓動 - 它不會掛起正在進行的操作。在執行操作時,您總會有可能失去網絡,因此您應該在操作中說明這一點。

+0

我正在嘗試這樣的方法,但當連通性返回時,我遇到了「超出範圍的dealloc'd」塊的問題。稍後您是否有任何問題調用您的塊?看起來像:「無法恢復當前幀」 –

1

你看過使用AFNetworking庫嗎?我相信它已經融入了Reachabiltiy,並且可以按照你的意願行事。

+0

謝謝。我曾看過AFNetworking庫,但它似乎更多的是NSURL請求,而不是任何我想在互聯網可用的情況下才開始執行的任意塊(它可能只對部分塊執行使用網絡連接)。 – Devang

+0

我明白你的意思了......可達性的答案應該是我的下一個想法,btu我看到有人已經充實了這個想法。 –

0

我是GCD和Blocks的忠實粉絲,但爲此我將使用NSOperationQueue構建解決方案。 GCD在我看來更多的是低層次的東西。使用NSOperationQueue您可以取消某些操作。你也可以表達對其他操作的依賴關係(如果你的應用程序需要這樣做)。