gpt4 book ai didi

swift - 信号量不等待 ios 中 Web 服务的第二次函数调用

转载 作者:行者123 更新时间:2023-11-28 16:15:13 26 4
gpt4 key购买 nike

我有一个具有多种功能的类(class)。在那个类中,我称之为 web 服务的两个函数,第一个 web 服务函数正常工作。但是第二个 web 服务方法不等待服务的响应它可以自动调用另一个服务我用过

let saveSemaphore = dispatch_semaphore_create(0) as dispatch_semaphore_t
let count = arrDeleteExecutionDetails.count

for (index, object) in arrDeleteExecutionDetails.enumerate()
{
Common.checklistExecute = object

let request = "\(Common.webServiceURL!)/ProInspectorJson.svc/DeleteExecutionDetails?pExecutionDetailsId=\(object.id_ExecutionDetails!)"
let webservice = WebServiceCall(url: request, delegate: self)

webservice.webServiceGetMethod(request)

if index != count-1
{
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER)
}
else
{
dispatch_semaphore_signal(semaphore)
}

上述方法正常运行

for checklistExecution in arrExecutionDetails
{
Common.checklistExecute = checklistExecution

let request = "\(Common.webServiceURL!)/ProInspectorJson.svc/SaveExecutionV3?scheduleID=\(checklistExecution.id_Agendamentor!)&userID=\(Common.userId!)&ID_PI_ChecklistConfiguration=\(checklistExecution.id_ChecklistConfig!)&Observations=\(checklistExecution.observation!)&ID_PI_tblMastRiskFactor=\(checklistExecution.id_RiskFactor!)&CorrectiveAction=\(checklistExecution.correctiveActions!)&ID_PI_FormulaResultsHeader=0&Longitude=0&Lattitude=0&checklistExecutionId=\(checklistExecution.id_ExecutionDetails!)&ErrorCode=0&ID_PI_ObjectSubCategory=\(checklistExecution.objectSubCategory!)"

let webservice = WebServiceCall(url: request, delegate: self)

webservice.webServiceGetMethod(request)

dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER)

}

但是第二个不行

for 循环有 5 个元素,这 5 个元素同时调用。它不是在等待第一个服务响应。

dispatch_semaphore_signal(semaphore)

我已经完美地调用了。

最佳答案

您的第一个示例不会在循环的最后一次迭代中执行 dispatch_semaphore_wait,而是奇怪地发出另一个 dispatch_semaphore_signal。假设您的代表总是发出信号,您最终会遇到不匹配的信号量信号。

因此,如果您在第二个示例中使用相同的信号量,您可能会得到两个额外的信号(不仅是您在第一个示例中的 for 循环中发出的信号当 indexcount - 1 时,但大概您对委托(delegate)方法的最后一次迭代也可能发出了不满意的信号),因此第二个循环中的三个请求将同时运行。

当您使用此信号量模式时,请确保每个“信号”都与“等待”相匹配。如果你在每个“signal”和“wait”处添加 print 语句,这些不平衡的调用就会跳出来(而不是看到交替的“wait”和“signal”调用,你会看到一系列连续的“信号”调用(在本例中,在第一个 for 循环的末尾))。

最重要的是,您可能想要删除 if index == count-1 { ... } 检查,而只是 dispatch_semaphore_wait。如果委托(delegate)方法中发生了一些奇怪的事情,需要一些逻辑,你应该编辑你的问题,向我们展示你为什么采用你所做的逻辑。

更好的是,您真的应该完全删除这些信号量的代码,而是采用异步模式。编写同步代码感觉很直观,但它实际上是低效的(阻塞线程;失去并发请求的巨大好处;等等)和问题(容易死锁;永远不应该从主线程完成;等等)。您应该采用异步模式,例如分派(dispatch)组或 NSOperation 依赖项。

关于swift - 信号量不等待 ios 中 Web 服务的第二次函数调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39170263/

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