вызов функции Swift с обработчиком завершения в Objective- C - PullRequest
0 голосов
/ 10 февраля 2020

У меня есть собственное приложение реакции. Я пытаюсь связать реагировать нативно с ios:

RCT_EXPORT_METHOD(getUserProfile:(RCTResponseSenderBlock)callback) {
  Cosmote *cosmote = [[Cosmote alloc] init];
  NSString * x;
  NSString * str;
  x = [cosmote getUserProfileWithCompletionHandler:^(NSString* string){string}]
  callback(@[x]);
}

В Cosmote.swift у меня есть функция:

@objc
  open func getUserProfile(completionHandler: @escaping (_ s: String) -> ()) {
    let x = UserDetailsManager.self;
    x.getUserDetails(completionBlock: {data in
      print("got user Details")
      var json:String = "{\"data\": {\"guid\": \"\(data.guid)\", \"email\": \"\(data.email)\", \"username\": \"\(data.username)\", \"firstName\": \"\(data.firstname)\", \"lastName\": \"\(data.lastname)\", \"otePortalStatus\": \"\(data.otePortalStatus)\", \"otePortalisCorporate\": \"\(data.otePortalisCorporate)\", \"otePortalUserLevel\": \"\(data.otePortalUserLevel)\", \"otePortalAuthenticationLevel\": \"\(data.otePortalAuthenticationLevel)\", \"otePortalPIN\": \"\(data.otePortalPIN)\", \"otePortalEbppActivationDate\": \"\(data.otePortalEbppActivationDate)\", \"otePortalEbppEcareNumber\": \"\(data.otePortalEbppEcareNumber)\", \"otePortalEbppStatus\": \"\(data.otePortalEbppStatus)\", \"otegroupPasswordDate\": \"\(data.otegroupPasswordDate)\", \"otegroupStatus\": \"\(data.otegroupStatus)\", \"otegroupPasswordExpiration\": \"\(data.otegroupPasswordExpiration)\", \"otegroupPasswordReset\": \"\(data.otegroupPasswordReset)\", \"otegroupRegistrationDate\": \"\(data.otegroupRegistrationDate)\", \"otegroupAlternativeEmail\": \"\(data.otegroupAlternativeEmail)\", \"otegroupAlternativeMSISDN\": \"\(data.otegroupAlternativeMSISDN)\", \"imageURL\": \"\(data.imageURL)\"}}"
      completionHandler(json);
    }, onError: {_ in
      print("did not get user Details")
      completionHandler("{}");
    })
  }

Первая функция в строке:

x = [cosmote getUserProfileWithCompletionHandler:^(NSString* string){string}]

Я получил ошибки:

Присвоение 'NSString * __ strong' из несовместимого типа ' void '

Несовместимые типы указателей блоков, отправляющие' void (^) (NSString * __ strong) 'параметру типа' NSString * _Nonnull (^ _Nonnull) (NSString * _Nonnull __strong) '

Как я могу это исправить?

1 Ответ

1 голос
/ 10 февраля 2020

Просто вызовите свой «обратный вызов» изнутри методов завершенияHandler. Это должно работать для вас:

RCT_EXPORT_METHOD(getUserProfile:(RCTResponseSenderBlock)callback) {
   Cosmote *cosmote = [[Cosmote alloc] init];
   [cosmote getUserProfileWithCompletionHandler:^(NSString* string){
      callback(string)
   }];
}
...