簡體   English   中英

從對象init的GCD安全地調用后來的UIViewController方法

[英]Safely call method of later UIViewController from GCD of object init

感謝在使用GCD時鎖定一個對象的NSMutableArray而不是我的對象的其余部分我有一個用戶對象,它通過初始化的gcd填充一個位置數組,希望當我們模態地到達LocationViewController時,位置存在於user.locations (用戶沿着viewcontrollers傳遞),如果它們不在那里,那么我只需在選擇器中顯示'loading ...'。

理想情況下,我希望在dispatch_sync方法中強制刷新用戶的gcd。 我可以為LocationViewController添加一個方法來刷新選擇器等,但我不知道如何安全地訪問它。

我的第一個想法是在LocationViewController中,如果位置不存在(即nil),那么在用戶中設置對此LocationViewController的引用。 dispatch_sync如果locCont不是nil,我可以調用方法[locCont mymethod] 但我不確定如何在用戶類中設置屬性?

@property (strong, nonatomic) LocationsViewController * locCont;

讓我擔心的是用戶可以在任何時候注銷並返回到根視圖。 然后我會開始

user.locCont = nil

ARC會很好地對任何宿醉內存進行排序嗎?

我的另一個問題是如果他們不選擇設置位置並且稍后查看會發生什么。 我想我能勝任,通過設置user.locCont在到零prepareforsegue

有沒有更好的方法來讓LocationsViewController刷新,如果用戶到達那里?

我建議使用通知來避免“用戶”對象和視圖控制器之間的強連接。

LocationViewController將在其init方法中注冊自定義通知,並在dealloc取消注冊。

GCD代碼在完成后“發布”通知。 這會導致所有偵聽器得到通知,以便LocationViewController可以刷新其視圖。

請參閱NSNotificationCenter文檔,以及通過Objective-C中的NSNotificationCenter發送和接收消息? 獲得有助於開始的好示例代碼。

如果您檢索某些user對象異步發生的數據,並且您希望視圖控制器能夠訪問此對象,則通常會保留對此user對象的一些外部引用。 一種常見的方法是使該user對象成為單例。 另一種方法是將其作為app委托的屬性。 無論哪種方式, user對象可能都不會維護對任何視圖控制器的引用。 user對象只是在異步檢索信息的業務中,視圖控制器可以通過單例或app委托訪問user對象的當前狀態。

如果您希望user對象能夠在數據檢索完成時通知視圖控制器,您可能需要通過通知中心發布通知。 視圖控制器可以注冊自己以觀察這些通知(並且在視圖控制器解除自身之前,將其自身移除為該通知的觀察者)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM