この質問は、Swinject for Swift の経験が豊富な人向けです。
問題のあるコードを示します。私の質問は一番下にあります。
かなり多くのコードがあります。申し訳ありません。
これはMySwinjectStoryboard.swift
登録です:
import Swinject
extension SwinjectStoryboard
{
class func setup ()
{
defaultContainer.register( Stopwatch.self )
{
responder in Stopwatch(
signals: responder.resolve( SignalsService.self )!
)
}
defaultContainer.register( SignalsService.self )
{
_ in SignalsService()
}.inObjectScope( .Container )
defaultContainer.register( ImageService.self )
{
responder in ImageService(
signals: responder.resolve( SignalsService.self )!
, stopwatch: responder.resolve( Stopwatch.self )!
)
}.inObjectScope( .Container )
defaultContainer.registerForStoryboard( StartUpViewController.self )
{
resolvable, viewController in
viewController.stopwatch = resolvable.resolve( Stopwatch.self )!
viewController.image = resolvable.resolve( ImageService.self )!
}
}
}
これはStopwatch.swift
、onComplete ハンドラーを起動する前にしばらく一時停止するだけです。
import Foundation
class Stopwatch: StopwatchProtocol
{
var key: String { return "Stopwatch_\( _key ).Complete" }
private var
_signals: SignalsProtocol
, _key: UInt16
, _timer: NSTimer?
, _data: AnyObject?
func startWith (
Delay delay: Double
, ForListener closure: ( String, Any? ) -> Void
){
_data = nil
_startWith( Delay: delay, ForListener: closure )
}
func stop ()
{
guard let timer = _timer else { return }
timer.invalidate()
_timer = nil
_data = nil
}
private func _startWith (
Delay delay: Double
, ForListener closure: ( String, Any? ) -> Void
){
stop()
_timer = NSTimer.scheduledTimerWithTimeInterval(
NSTimeInterval( delay )
, target: self
, selector: #selector( _onTimerComplete )
, userInfo: nil
, repeats: false
)
}
@objc private func _onTimerComplete ()
{
stop()
print( "stopwatch with key `\( key )` complete." )
}
required init ( signals: SignalsProtocol )
{
_signals = signals
_key = getPrimaryKey()
print( "primary key: \( _key )" )
}
}
ImageService.swift
init
現在、関数を介してシグナルとストップウォッチ プロパティを受け入れるだけです。
protocol ImageProtocol {}
class ImageService: ImageProtocol
{
private let
_signals: SignalsProtocol
, _stopwatch: StopwatchProtocol
required init (
signals: SignalsProtocol
, stopwatch: StopwatchProtocol
){
_signals = signals
_stopwatch = stopwatch
lo( "ImageService key: \( _stopwatch.key )" )
}
}
SignalsService.swift
現在、空の Model クラスです:
protocol SignalsProtocol {}
class SignalsService: SignalsProtocol {}
現在、注入されたプロパティを受け入れるだけのStartUpViewController.swift
基本的なものです。UIViewController
import UIKit
class StartUpViewController: UIViewController
{
var image: ImageService? {
willSet {
guard _image == nil else { return }
_image = newValue
}
}
var signals: SignalsService? {
willSet {
guard _signals == nil else { return }
_signals = newValue
}
}
var stopwatch: StopwatchProtocol? {
willSet {
guard _stopwatch == nil else { return }
_stopwatch = newValue
print( "StartUpViewController key: \( _stopwatch.key )" )
}
}
internal var
_image: ImageService!
, _signals: SignalsService!
, _stopwatch: Stopwatch!
}
最後にgetPrivateKey()
、一意の Int を返す単純なグローバル スタティックです。
private var _primaryKey = UInt16( 0 )
func getPrimaryKey () -> UInt16
{
_primaryKey += 1
return _primaryKey
}
私が理解しているように、私が登録Stopwatch.swift
した方法MySwinjectStoryboard.swift
は、インスタンスが注入されるたびに、新しい個別のインスタンスになることを意味します。ただし、 と の両方ImageService.swift
にStartUpViewController.swift
同じインスタンスが挿入されています。
StartUpViewController key: Stopwatch_2.Complete
ImageService key: Stopwatch_2.Complete
ImageService
のキーは次のようになります。
ImageService key: Stopwatch_3.Complete
なぜこれが起こっているのか知っている人はいますか?ありがとうございました。