2009-08-19 39 views
7

我有一個IPhone應用程序,它使用web服務從服務器獲取數據。我將每個調用放到一個NSOperation子類的webservice中,以便它可以被線程化。我的問題是,推薦的方式是從已完成的NSOperation子類中傳回信息。我目前正在發送一個NSNotification到我的main方法的末尾,任何等待NSOperation完成的代碼都會訂閱這個通知。然後我將使用NSNotificationWithName的Object對象部分:Object:從操作中傳回信息。可可 - 從NSOperation返回信息

我不知道是否有更好的方法來做到這一點。我聽說過Key Value Coding,然後我可以使用Key Value Observing來檢測操作的isFinished屬性何時更改,但我不確定最佳實踐是什麼。

我也想確保我的應用程序是線程安全的,這是我認爲不會是一個問題,只要我通知在main方法結束這樣的通知的對象將送出不再在線程中使用,因爲它會結束。

最後,我打電話通知如下所示:

[[NSNotificationCenter defaultCenter] performSelectorOnMainThread:@selector(postNotification:) withObject:[NSNotification notificationWithName:@"notificationName" object:dataObject] waitUntilDone:NO]; 

回答

16

我以兩種方式親自完成了這項工作。兩人工作得很好。

第一種方式

您可以返回「輸出」功能,你調用該函數的操作完成後。您可以觀察NSOperation對象上的密鑰isFinished,或使用-[NSOperationQueue waitUntilAllOperationsAreFinished]來確定操作何時完成。

第二種方式

您可以使用從一個的NSOperation委託或目標/行動。只要確保在調用委託函數或觸發目標/動作時,在主線程上使用-[NSObject performSelectorOnMainThread:withObject:waitUntilDone:]

1

這取決於你的應用程序。你期望同時運行多少個操作?你對結果做什麼?聚合結果還是需要立即在UI中顯示?

在主線程中發送通知是相當重量級的。根據你對結果的處理方式,你可能會窒息你的用戶界面。從設計角度來看,你會從通知中發送的對象是觀察類應該知道的事情嗎?從操作中更改模型對象可能更有意義,並讓控制器對象觀察這些更改。

你可以使用Key值觀察,但你一定要小心。觀察者在同一個線程中觀察到發生了變化,因此在觀察isFinished時不應直接進行UI更改。

如果對象是唯一擁有和操作中使用,那麼是的,它應該是安全的,在主要結束時發送。它將被通知保留。

0

該文檔說,當您想要獲取結果時最好使操作成員變量操作。但我認爲解決方案不會適應你。

我認爲,通知是好的,還有另一種方式來獲得的結果是讓你自己操作完成塊。看到這裏:Return data from NSOperation?我試過它很好。

我試過另一種方法,設置操作完成塊,並對操作做一個弱引用,並使結果成爲操作的一個屬性。所以你完成後可以得到操作結果。

但是完成並不可靠,當您取消操作時也會執行完成操作。所以選擇最適合你的。

+0

該文檔是您可能會喜歡它。 – frank 2015-04-08 09:51:24