0

我在我的 react native ios 应用程序中使用 swift native 模块从资产 url 生成动画 gif。它在第一次尝试时运行良好,但是当我转义组件并在使用一次后传递新资产时,应用程序崩溃,有时会显示此错误:

反应错误:

反应错误

或者有时xcode将我重定向到这个objective-c函数,告诉我要返回的_instance没有价值:

Objective-C 错误

这是我在我的反应组件中调用我的本机模块的方式:

callImages: function(){
var that = this
const imagesUri = this.parseImages();
var promise = new Promise(function(resolve, reject) {
  NativeModules.GifGenerator.initFunction(imagesUri, resolve)
});

promise.then(function(o) {
  base64 = "data:image/gif;base64,"+o.url
  imagesUri.push(base64);
  that.setState({images: imagesUri});
});
}

我如何在 GifGenerator.m 中导出我的 swift 模块:

@interface RCT_EXTERN_MODULE(GifGenerator, NSObject)

RCT_EXTERN_METHOD(initFunction:(NSArray *)images 
                  callback:(RCTResponseSenderBlock)callback);

@end

我的快速课程的重要部分:

func initFunction(images : [String], callback: (NSObject) -> () ){

self.standardImages = images

return getImages(images, handler: self.generationCallback , someCallback: callback )
}

...
(getImages call generate passing the callback function to it)
...

func generate(mainHandler: (NSObject) -> () ) -> Void {

...
(movie to gif generation using AVAssetWriter)
...

videoWriter.finishWritingWithCompletionHandler { () -> Void in
        if error == nil {

          let resultUrl = self.videoToGif(videoOutputURL)
          let ImageData = NSData(contentsOfURL: resultUrl)
          let imageBase64:String =         ImageData!.base64EncodedStringWithOptions(.Encoding64CharacterLineLength)
          mainHandler([["url": imageBase64], ["error": "non"]])

            if let data = NSData(contentsOfURL: resultUrl) {
              let image = UIImage(data: data)
              UIImageWriteToSavedPhotosAlbum(image!, nil, nil, nil);
            }

        }

它们是我代码的重要部分,但如果您需要,我可以向您展示更多

4

1 回答 1

0

我的猜测是您每次在 swift 端使用回调时都需要重置回调...因此,在您的 js 回调方法的警察处,将您的 js cb 重新注册为 swift ..

于 2017-08-03T00:00:25.807 回答