gomobile: обязательные обратные вызовы для ObjC
У меня есть интерфейс Go
type GetResponse interface { OnResult(json string) }
Я должен подписаться на это событие OnResult от ObjC, используя этот интерфейс.
func Subscribe( response GetResponse){ response.OnResult("some json") }
ObjC bind дает мне соответствующий протокол и базовый класс
@interface GetResponse : NSObject <goSeqRefInterface, GetResponse> {
}
@property(strong, readonly) id _ref;
- (instancetype)initWithRef:(id)ref;
- (void)onResult:(NSString*)json;
@end
Итак, мне нужно получить этот JSON в моем окружении ObjC. Как я могу это сделать?
- Созданиеподклассов Если я создаю подкласс этого GetResponse или просто использую его как есть и перехожу к подпрограмме Subscribe, происходит сбой'go_seq_go_to_refnum на объектах target-c не разрешен'
Категория, если я создаю структуру на стороне Go с поддержкой протокола, я не могу создать ее подкласс, но, по крайней мере, это не сбои:
type GetResponseStruct struct{} func (GetResponseStruct) OnResult(json string){log.Info("GO RESULT")} func CreateGetResponse() *GetResponseStruct{ return &GetResponseStruct{}}
У меня есть твердый объект без очевидного способа подключить мой обратный вызов. Если я создаю категорию и переопределяю подпрограмму onResult, она не вызывается. Просто потому, что переопределение существующих методов класса не определяет поведение в соответствии с AppleDoc. Каждый раз, когда OnResult вызывается из Go, запускается реализация по умолчанию и появляется "GO RESULT".
Swizzling Я пытался использовать category и swizzle (замените реализацию метода на мой переименованный метод), но он работает, только если я вызываю onResult из ObjC env.
Любой способ решить мою проблему? Или я просто красный док не очень точно? пожалуйста, помогите мне
0 ответов
Сегодня я столкнулся с подобной проблемой. Я думал, что это ошибка в gomobile, но, в конце концов, это было мое непонимание swift/objc. https://github.com/golang/go/issues/35003
TL; DR этой ошибки заключается в том, что вы должны создать подкласс протокола, а не интерфейса. Если вы используете Swift, вы можете создать подклассGetResponseProtocol
:
class MyResponse: GetResponseProtocol
Если в objc, то вы, вероятно, захотите напрямую реализовать протокол GetResponse, а не создавать подклассы интерфейса.