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. Как я могу это сделать?

  1. Созданиеподклассов Если я создаю подкласс этого GetResponse или просто использую его как есть и перехожу к подпрограмме Subscribe, происходит сбой'go_seq_go_to_refnum на объектах target-c не разрешен'
  2. Категория, если я создаю структуру на стороне Go с поддержкой протокола, я не могу создать ее подкласс, но, по крайней мере, это не сбои:

    type GetResponseStruct struct{}
    func (GetResponseStruct) OnResult(json string){log.Info("GO RESULT")}
    func CreateGetResponse() *GetResponseStruct{ return &GetResponseStruct{}}
    

    У меня есть твердый объект без очевидного способа подключить мой обратный вызов. Если я создаю категорию и переопределяю подпрограмму onResult, она не вызывается. Просто потому, что переопределение существующих методов класса не определяет поведение в соответствии с AppleDoc. Каждый раз, когда OnResult вызывается из Go, запускается реализация по умолчанию и появляется "GO RESULT".

  3. 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, а не создавать подклассы интерфейса.

Другие вопросы по тегам