2013-08-28 15 views
0

我具有被創建/通過HTTP更新核心數據對象。我也想創建一個後臺線程來持續接收來自應用程序的時間戳和狀態信息並更新核心數據對象。我應該使用NSOperation還是GCD?因爲它不只是一個簡單的任務,因爲的NSOperation我可以在這循環似乎更好,但我無法弄清楚如何將信息傳遞到操作,從主線程,而它的運行。有沒有一個簡單的方法來做到這一點?我已經看到很多關於從操作向主線程發送消息的線程/文章,但沒有關於向它傳遞消息的內容。ios - 將數據發送給NSOperation還是應該使用NSThread?

是否使用的NSOperation/GCD似乎是一個很好的解決方案?

回答

0

退後一步,重新審視你的架構。您應該使用自身使用專用分派隊列的管理對象上下文(選項NSPrivateQueueConcurrencyType)。

然後,您將使用NSURLConnections獲取所需的數據,並且當您在委託方法中獲取數據時,可以使用performBlock異步更新存儲庫。

相反,你可能想使用performBlockAndWait數據,使用塊變量或可變的預先定義的對象接收來自塊的結果來檢索。

+0

獲取數據時,我這樣做。我需要的是根據應用程序狀態更新數據的單獨過程。因此,我獲取數據並使用'performBlock'並將數據保存在託管對象上下文中。根據廣播狀態的計算,應用程序廣播狀態信息和核心數據實體需要單獨更新。 – ravun

+0

我有點困惑 - 你可以使用performBlock來更新核心數據。在「更新」的最後,讓performBlock再做一件事 - 比如在主隊列上排隊一塊,以更新可能可見的UI元素。如果您還有其他需要處理的內容 - 可能是從核心數據中提取數據,則可以對這些數據使用performBlock,並在主線程中對最後一個隊列進行排隊。你真的需要另一個隊列去做嗎?如果是這樣,則創建一個隊列,在其上發佈工作,完成之後將塊發送到主隊列以更新UI。不要建議使用NSOperation。 –

+0

我已經想通了...問題是我來自java背景,正在考慮繼承NSThread,並且需要從主線程向它傳遞數據。我試圖避免使用塊(我習慣將所有內容封裝在單獨的類/文件中)。我認爲我讓這個過程比需要的更復雜。 – ravun

0

我看着這一切不對(主要是想繼承NSThread和它傳遞的數據/)。我沒有考慮適當地使用塊。

從本質上講,我在做什麼是:

loadStuff:(NSDictionary *)stuff { 
    // stuff is data from HTTP GET request 
    NSManagedObjectContext *context = // init context with NSPrivateQueueConcurrencyType 
    context.parentContext = // main context 
    [context performBlock:^{ 
     // insert/update entities 
     // save context 
    }]; 
} 

但後來我需要循環在後臺線程來更新實體:

//inside some method 
dispatch_async(global_queue, ^{ 
    // _currentTimestamp is updated by a delegate 
    NSInterval timestamp = _currentTimestamp; 
    while (run) { 
     if (timestamp != _currentTimestamp) { 
      // do calculation 
      // update entities if needed 
      // save context 
     } 
    } 
}); 
相關問題