【问题标题】:Sharing data by memory reference between iOS app and framework在 iOS 应用程序和框架之间通过内存引用共享数据
【发布时间】:2019-10-24 00:00:55
【问题描述】:

我正在开发一个应用程序,它使用单例模式来存储单会话用户状态数据。它使用需要访问相同数据的框架,但当前框架仅在尝试访问类属性时才找到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 类中:

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

在整个框架和应用程序中,我调用UserState.username 来访问属性。

我知道通过值而不是通过引用传递会起作用,但由于属性的数量以及在应用程序中发生更改时需要更新它们,它会更加乏味。

我最初尝试将UserStateBase 设为协议,但这不起作用,因为它包含几个属性,这些属性被定义为实现类的协议,并且编译器抱怨它需要在其中声明实现同样的方式(例如,协议中的locationManager 需要实现将其声明为var locationManager : LocationManagerDelegate = LocationManager(),这意味着每次我想访问不在LocationManagerDelegate 协议中的函数时,我都必须转换为LocationManager)。

这就是为什么 currentUsercurrentPass 被声明两次的原因 - 我的意图是让子类覆盖基类,我认为这是正在发生的事情,因为编译器没有抱怨不明确的引用。

这种模式在修改后是否有效,还是我需要将所有 UserState 值单独传递给框架?

【问题讨论】:

    标签: ios swift ios-frameworks


    【解决方案1】:

    因为 Swift 中的所有内容都隐含为 internalUserStateBase 中的属性实际上并没有暴露给应用程序(尽管类本身是),所以 UserStateClass 不能覆盖它们(并且重新定义不会' t 导致编译器错误),因此当框架被引用到应用程序的 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()
    

    一切都按预期进行。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-11-14
      • 2017-09-11
      • 2019-03-29
      • 1970-01-01
      • 1970-01-01
      • 2015-12-15
      • 1970-01-01
      相关资源
      最近更新 更多