gpt4 book ai didi

ios - 使用 NSOperationQueue 获取 BAD_EXEC

转载 作者:行者123 更新时间:2023-12-01 18:08:26 24 4
gpt4 key购买 nike

我需要在我的应用程序中运行异步任务

我有以下代码:

- (NSDictionary *)parallelSendSync:(NSDictionary *)requests {

NSMutableDictionary *responseDict = [[NSMutableDictionary alloc] init];
for (NSString *key in [requests allKeys]) {
[_parallelSendQueue addOperationWithBlock:^{
NSDictionary *sendResult = [self send:requests[key] :nil];
[responseDict setObject:sendResult forKey:key]; //this line sometimes throws BAD_EXEC
}];

}
[_parallelSendQueue waitUntilAllOperationsAreFinished];

return responseDict.copy;

}
_parallelSendQueue最多接受 5 个并发操作

不幸的是,这只在部分时间有效,有时它可以正常工作,有时它会抛出 BAD_EXEC

糟糕的执行官可能是什么原因?

最佳答案

问题是多个线程正在使用同一个对象,这可能导致非线程安全对象的内存损坏。

你有两个选择:

  • 从多个线程或并行队列中锁定您正在使用的对象,这样一次只有一个操作可以更改它
  • 分派(dispatch)到拥有共享对象的特定线程或串行队列并从那里更改它(但请注意,如果您分派(dispatch)到当前正在调用 waitUntilAllOperationsAreFinished 的同一线程,程序会死锁)

  • 我认为在您的情况下最好的解决方案是锁定:
    - (NSDictionary *)parallelSendSync:(NSDictionary *)requests {

    NSMutableDictionary *responseDict = [[NSMutableDictionary alloc] init];
    for (NSString *key in [requests allKeys]) {
    [_parallelSendQueue addOperationWithBlock:^{
    NSDictionary *sendResult = [self send:requests[key] :nil];
    // synchronized locks the object so there is no memory corruption
    @synchronized(responseDict) {
    [responseDict setObject:sendResult forKey:key];
    }
    }];
    }
    [_parallelSendQueue waitUntilAllOperationsAreFinished];

    return responseDict.copy;

    }

    关于ios - 使用 NSOperationQueue 获取 BAD_EXEC,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36551678/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com