gomobile: обязательные обратные вызовы для ObjC - PullRequest
0 голосов
/ 12 июня 2018

У меня есть интерфейс Go

type GetResponse interface { OnResult(json string) }

Я должен подписаться на это событие OnResult от ObjC, используя этот интерфейс.

func Subscribe( response GetResponse){ response.OnResult("some json") }

Привязка ObjC дает мне соответствующий протокол и базовыйкласс

@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 Я пытался использовать категорию и Swizzle (замените реализацию метода на мою, переименованнуюметод), но это работает, только если я вызываю onResult из ObjC env.

Любой способ решить мою проблему?Или я просто красный док не очень точно?Пожалуйста, помогите мне

...