簡體   English   中英

通過 iOS 應用程序和框架之間的 memory 引用共享數據

[英]Sharing data by memory reference between iOS app and framework

我正在開發一個應用程序,它使用 singleton 模式來存儲單會話用戶 state 數據。 它使用需要訪問相同數據的框架,但目前該框架僅在嘗試訪問 class 屬性時才找到nil 這是我目前的設置方式。

在框架中:

open class UserStateBase {
    var locationManager : LocationManagerDelegate!
    var currentUser : String?
    var currentPass : String?
    // ... a dozen other properties
}

public var UserState : UserStateBase!

在應用程序中:

import Framework

class UserStateClass : UserStateBase {
    var locationManager = LocationManager()
    var currentUser : String?
    var currentPass : String?
    // ... many more properties
}

var UserState = UserStateClass()

在應用程序的AppDelegate class 中:

func application(...) {
    // Override point for customisation after application launch
    Framework.UserState = App_Module.UserState
}

在整個框架和應用程序中,我調用UserState.username來訪問屬性。

我知道通過值而不是通過引用傳遞會起作用,但是由於屬性的數量以及每當它們在應用程序中發生更改時都需要更新它們,它會更加乏味。

我最初嘗試將UserStateBase協議,但這不起作用,因為它包含幾個屬性,這些屬性被定義為實現 class 的協議,編譯器抱怨它需要以相同的方式聲明實現(例如協議中的locationManager需要實現將其聲明為var locationManager: LocationManagerDelegate = LocationManager() ,這意味着每次我想訪問不在LocationManagerDelegate協議中的 function 時,我都必須轉換為LocationManager

這就是為什么currentUsercurrentPass被聲明兩次的原因——我的意圖是讓子類覆蓋基礎 class,我認為這是正在發生的事情,因為編譯器沒有抱怨不明確的引用。

這種模式是否可以通過修改工作,還是我需要將所有 UserState 值單獨傳遞給框架?

因為 Swift 中的所有內容都是隱式internal ,所以UserStateBase中的屬性實際上並沒有暴露給應用程序(盡管 class 本身就是),所以UserStateClass不能覆蓋它們(並且重新定義不會導致編譯器錯誤),因此當框架獲得了對應用程序UserState實例的引用,它知道的所有屬性(在UserStateBase中的屬性)仍未初始化。

意識到這一點,我決定硬着頭皮恢復使用協議。 這是我使用的結果模式。

在框架中:

public protocol UserStateDelegate {
    var locationManagerDelegate : LocationManagerDelegate { get }
    var currentUser : String? { get }
    var currentPass : String? { get }
    // ... a dozen other properties
}

public var UserState : UserStateDelegate!

在應用程序中:

import Framework

class UserStateClass : UserStateDelegate {
    var locationManagerDelegate : LocationManagerDelegate = LocationManager()
    // This computed property saves me from having to perform the cast everywhere it's used
    var locationManager : LocationManager { return locationManagerDelegate as! LocationManager }
    var currentUser : String?
    var currentPass : String?
    // ... many more properties
}

var UserState = UserStateClass()

一切都按預期工作。

暫無
暫無

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

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