简体   繁体   中英

App doesn't enter in the initial ViewController using Typhoon

I have created a project to test the Typhoon framework , I have created two classes ApplicationAssembly and CoreAssembly where I inject some properties and constructors and a default Configuration.plist to load data from it.

ApplicationAssembly

public class ApplicationAssembly: TyphoonAssembly { 

    public dynamic func config() -> AnyObject {
       return TyphoonDefinition.configDefinitionWithName("Config.plist")
    } 
}

CoreAssembly

public class CoreAssembly: TyphoonAssembly {

    public dynamic func apiHandler() -> AnyObject {
       return TyphoonDefinition.withClass(ApiHandler.self) {
           (definition) in

           definition.useInitializer("initWithDebugging:debugProcess:mainURL:") {
              (initializer) in

               initializer.injectParameterWith(TyphoonConfig("debug_mode"))
               initializer.injectParameterWith(TyphoonConfig("debug_path"))
               initializer.injectParameterWith(TyphoonConfig("api_url"))                
           }
           definition.scope = TyphoonScope.Singleton
       }
    }    

    public dynamic func viewController() -> AnyObject {

       return TyphoonDefinition.withClass(ViewController.self) {
           (definition) in

           definition.injectProperty("apiHandler", with:self.apiHandler())
       }
    }   
}

I set in my Info.plist the TyphoonInitialAssemblies first the ApplicationAssembly and then the CoreAssembly .

Everything works fine without exceptions or anything except that the app never enters in AppDelegate neither in the ViewController class. I don't know maybe I missed something in the doc or anything.

What I'm missing here?

Why in debug not enter in the ViewController class that is the initial view controller in Storyboard?

The problem was that the ApiHandler class does not extend NSObject, which is a requirement. This is because Typhoon is an introspective Dependency Injection container. As Swift has no native introspection it uses the Objective-C run-time.

The App should not however have crashed in such an obfuscated way. I have opened an issue to look at how to fail with a meaningful error, rather than infinitely recurse.

After solving the initial problem, I also noted that the init method for ApiHandler passing in a Swift Bool object. This needs to be an NSNumber.

init(debugging : NSNumber, debugProcess : String, mainURL : String) {
    self.debugging = debugging.boolValue
    self.debugProcess = debugProcess
    self.mainURL = mainURL                
}

Given that Typhoon uses the Objective-C runtime, there are a few quirks to using it with Swift - the same kinds of rules outlined for using Swift with KVO apply.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM