Я новичок в 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.
[self class]
, потому что это помогало со старыми «логическими» тестами. . . было бы (AFAIK) безопасно изменить это на[NSBundle mainBundle]
. Давайте попробуем это. Я отправлю в основную ветку, и вы сможетеpod 'Typhoon', :head
- person Jasper Blues   schedule 18.03.2015[NSBundle mainBundle]
сработала для меня. Это сломало другие вещи? - person StephenP   schedule 18.03.2015[NSBundle mainBundle]
дляid<TyphoonResource>
, и оставил поведение метода+(id<TyphoonResource>)withName:
пока без изменений. Это также должно решить проблему. Я нажал это как Typhoon 3.0.2. Работает на вас? - person Jasper Blues   schedule 18.03.2015