You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React Native iOS端Swift并发加密任务无法实现问题求助

问题分析与解决方案

核心问题

  1. 原生端队列是串行的:你创建的DispatchQueue(label: "decrypting")默认是串行队列,所有通过queue.async提交的任务会按顺序逐个执行,完全没实现并行。
  2. JS端调用方式限制了并行:
    • 带await的for循环会串行发起请求,前一个任务完成才会调用下一个,哪怕原生支持并行也没用。
    • 不带await的循环虽然能并行发起请求,但因为原生队列是串行的,最终还是逐个执行,性能没提升。

具体修复步骤

1. 原生端改为并行队列

初始化队列时添加.concurrent属性,让队列支持并行执行任务:

// 创建并行队列
let queue = DispatchQueue(label: "decrypting", attributes: .concurrent)

@objc(decrypt:withKey:iv:tag:withResolver:withRejecter:)
func decrypt(hexCipherText: String, key: String, iv: String, tag: String, resolve:@escaping RCTPromiseResolveBlock, reject:@escaping RCTPromiseRejectBlock) -> Void {
    queue.async {
        do {
            guard let keyData = Data(hexString: key) else {
                throw CryptoError.runtimeError("Invalid key")
            }

            let decryptedData = try self.decryptData(cipherData: hexCipherText.hexaData, key: keyData, iv: iv, tag: tag)
            // React Native要求Promise回调必须在主线程执行
            DispatchQueue.main.async {
                resolve(decryptedData.hexadecimal)
            }
        } catch CryptoError.runtimeError(let errorMessage) {
            DispatchQueue.main.async {
                reject("InvalidArgumentError", errorMessage, nil)
            }
        } catch {
            DispatchQueue.main.async {
                reject("DecryptionError", "Failed to decrypt", error)
            }
        }
    }
}

注意:React Native规定Promise的resolve和reject必须在主线程调用,所以要把回调包在DispatchQueue.main.async里,避免线程问题。

2. JS端改用并行调用方式

放弃for循环里的await,用Promise.all或Promise.allSettled批量发起并行请求:

方式一:等待所有任务完成(任意失败则整体失败)

// 把所有解密任务包装成Promise数组
const decryptPromises = encryptedArr.map(item => JSCallNativeEncryption(item));

// 并行执行所有任务
Promise.all(decryptPromises)
  .then(allResults => {
    console.log('所有解密任务完成:', allResults);
    // 统一处理结果
  })
  .catch(error => {
    console.error('某个解密任务失败:', error);
    // 处理错误
  });

方式二:逐个处理结果(保留所有成功/失败状态)

如果需要单独处理每个任务的结果,不管成功还是失败,用Promise.allSettled:

const decryptPromises = encryptedArr.map(item => JSCallNativeEncryption(item));

Promise.allSettled(decryptPromises)
  .then(results => {
    results.forEach((result, index) => {
      if (result.status === 'fulfilled') {
        console.log(`第${index+1}个任务成功:`, result.value);
      } else {
        console.log(`第${index+1}个任务失败:`, result.reason);
      }
    });
  });

额外优化建议

  • 控制并发数:如果encryptedArr数量很大,一次性发起几百个并行任务会占用过多CPU资源,反而降低性能。可以分片处理,比如每次并行10个任务,完成后再处理下一批。
  • 原生端资源保护:如果decryptData里有共享资源(比如全局变量、文件读写),要加同步锁(比如NSLock或DispatchQueue.sync),避免竞态条件导致的错误。

内容的提问来源于stack exchange,提问作者Kim Mỹ

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 18:58:04