我有一个快速的类,我将其暴露给react-native,在其中,我有一个也暴露给react-native的函数。现在,当响应本机调用该函数时,它会在内部执行很多操作,但是在某个时间点后,它将返回一个对象。
现在它将调用将获取对象的特定函数。我无法将参数更改为该函数。但是我还有另一个功能,我想返回该功能以进行本地响应。我该怎么办。
func AckCallback(response:APIResponse) -> Void
{
print(response)
}
对于此函数,我无法更改参数表,因为它已被使用很多地方,但是我想将该函数的响应返回到本机响应。如果有人知道这个问题,请告诉我。
@objc func sendEvent(_ response: APIResponse, callback: (NSObject) -> ())
-> Void {
callback( [[
"responseCode" : "Working",
]] as NSObject)
}
我只想知道如何在AckCallback中使用此sendEvent,或者是否有其他方法可以发送该**
响应:APIResponse
**
本机反应。
答案 0 :(得分:1)
对于第一个创建的Swift类(例如YourModule.swift
)
//
// YourModule.swift
//
@objc(YourModule)
class YourModule: NSObject {
@objc func callNativeEvent(callback:RCTResponseSenderBlock)
-> Void {
// Here you can do your work and pass an object to the callback function.
// You can save assign a `callback` to the class property (e.g self.eventCallback = callback)
// and invoke that self.eventCallback after the asynchronous code ol somewhere else
NSObject *obj = [[NSObject alloc] init]; // your object here
callback([NSNull(), obj]);
// or if you want to return an error
// callback(["Error calling NativeEvent", NSNull()]);
// I'm not sure that RCTResponseSenderBlock works the same as in previous react-native versions. Maybe now you can pass an Object instead of an Array.
}
}
创建Bridge文件(例如YourModuleBridge.m
)
//
// YourModuleBridge.m
//
#import <Foundation/Foundation.h>
#import "UIKit/UIKit.h"
#import <React/RCTBridgeModule.h>
@interface RCT_EXTERN_MODULE(YourModule, NSObject)
RCT_EXTERN_METHOD(callNativeEvent:(RCTResponseSenderBlock)callback);
@end
此外,如果您的项目中不存在Bridging-Header
文件,则需要使用该文件。
//
// YourModule-Bridging-Header.h
//
#ifndef YourModule_Bridging_Header_h
#define YourModule_Bridging_Header_h
#if __has_include("RCTBridgeModule.h")
#import "RCTBridgeModule.h"
#else
#import <React/RCTBridgeModule.h>
#endif
#endif /* YourModule_Bridging_Header_h */
从JS </ p>
import { NativeModules } from 'react-native';
const YourModule = NativeModules.YourModule;
...
YourModule.callNativeEvent((error, response) => {
console.log('Error', error, 'Response', response);
});
答案 1 :(得分:1)
SwiftComponentManager.swift and SwiftComponentManager.m create these 2 files.
SwiftComponentManager.swift ->
@objc(SwiftComponentManager)
class SwiftComponentManager: NSObject {
@objc func passValueFromReact(_ value : String) {
debugPrint(" Print Here \(value)")
}
}
在SwiftComponentManager.m
中#import <Foundation/Foundation.h>
#import "React/RCTBridgeModule.h"
@interface RCT_EXTERN_MODULE(SwiftComponentManager, NSObject)
RCT_EXTERN_METHOD(passValueFromReact:(NSString *)value) //Here exported your swift function for React Native
@end
现在如何在React Native中调用此Swift函数。
将您的SwiftComponent导入 React JS 文件
const { SwiftComponentManager } = NativeModules
现在在JS文件中的所需位置调用函数值
SwiftComponentManager.passValueFromReact("Hello World")