TyphoonConfig пытается загрузить plist с неправильным путем пакета

Я новичок в Typhoon и не могу понять, как правильно загрузить мой Configuration.plist. Мой проект смоделирован по образцу Swift PocketForecast, хотя я начал с собственного проекта на основе CocoaPods и сам добавил в него Typhoon (т.е. я не начал с клонированного проекта PocketForecast). Я использую интеграцию plist с несколькими сборками.

Когда я использую это:

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

Я получаю сообщение о том, что файл не найден, и в отладчике я вижу, что путь, который он использует, - "/path/to/MyProject.app/Frameworks/Typhoon.framework", но, конечно, мой файл конфигурации не находится там, он находится в "/path/to/MyProject.app/Configuration.plist". Да, я подтвердил, что файл действительно существует.

Я попытался решить эту проблему, сделав что-то вроде этого:

public dynamic func config() -> AnyObject {
    return TyphoonDefinition.withClass(TyphoonConfigPostProcessor.self) {
        (definition) in
        definition.injectMethod("useResourceAtPath:") {
            (method) in
            method.injectParameterWith(self.configURL())
        }
    }
}

public dynamic func configURL() -> AnyObject {
    return TyphoonDefinition.withFactory(self.configBundle(), selector: "URLForResource:withExtension:", parameters: {
        (initializer) in
        initializer.injectParameterWith("Configuration")
        initializer.injectParameterWith("plist")
    })
}

public dynamic func configBundle() -> AnyObject {
    return TyphoonDefinition.withClass(NSBundle.self) {
        (definition) in
        definition.useInitializer("mainBundle")
    }
}    

И как ни странно, иногда это работает. Это выглядит случайным и основанным на порядке загрузки других моих сборок Typhoon. Другими словами, иногда все работает отлично, но в других случаях инициализация Typhoon вылетает с множеством различных ошибок, таких как «Нет компонента, соответствующего идентификатору XYZ» или «Не удается найти значение в конфигурации». Но, как я уже сказал, иногда это работает просто отлично.

Должно быть, мне не хватает какой-то фундаментальной части инициализации Typhoon, поэтому любая помощь очень ценится!

Редактировать: Таким образом, после некоторых поисков кажется, что первый метод, который я попробовал выше, терпит неудачу из-за проблемы с CocoaPods, использующей фреймворк вместо статической библиотеки для проектов Swift? Я нашел этот код в TyphoonResource:

+ (id <TyphoonResource>)withName:(NSString *)name
{
    return [self withName:name inBundle:[NSBundle bundleForClass:[self class]]];
}

И поскольку [self class] будет разрешаться в класс в рамках Typhoon, я думаю, я понимаю, почему это именно тот пакет, который он использует, но мне это кажется ошибкой. Я собираюсь выяснить, смогу ли я понять, почему это не сломает приложение PocketForecast.


person StephenP    schedule 17.03.2015    source источник
comment
Да, похоже, вы нашли ошибку. Я думаю, что мы используем здесь [self class], потому что это помогало со старыми «логическими» тестами. . . было бы (AFAIK) безопасно изменить это на [NSBundle mainBundle]. Давайте попробуем это. Я отправлю в основную ветку, и вы сможете pod 'Typhoon', :head   -  person Jasper Blues    schedule 18.03.2015
comment
github.com/appsquickly/Typhoon/issues/329   -  person Jasper Blues    schedule 18.03.2015
comment
Замена на [NSBundle mainBundle] сработала для меня. Это сломало другие вещи?   -  person StephenP    schedule 18.03.2015
comment
это не так, но я изменил TyphoonConfigPostProcessor, чтобы явно использовать [NSBundle mainBundle] для id<TyphoonResource>, и оставил поведение метода +(id<TyphoonResource>)withName: пока без изменений. Это также должно решить проблему. Я нажал это как Typhoon 3.0.2. Работает на вас?   -  person Jasper Blues    schedule 18.03.2015
comment
Да похоже. Спасибо!   -  person StephenP    schedule 18.03.2015


Ответы (1)


Это была ошибка в Typhoon 3.0.1. Как вы указали, когда Typhoon связан как среда Swift, используется неправильный пакет ресурсов TyphoonConfig. С тех пор это было исправлено в Typhoon 3.0.2.

person Jasper Blues    schedule 18.03.2015