为什么我们需要在ios中进行同步操作

时间:2017-01-10 05:06:30

标签: ios objective-c iphone swift

我想知道我们都知道异步任务对于并发是多么必要,但我们想知道为什么我们需要同步任务。而我们可以通过功能的正常使用来实现相同的目标。

谢谢&问候

罗希特夏尔

3 个答案:

答案 0 :(得分:1)

  • 当你调用synchronously时,意味着'启动该操作的线程将等待任务完成之前 继续”。 Asynchronous意味着它不会等待完成任务。
  • synchronous调用会停止当前操作,并在调用返回时返回。通过asynchronous来电,您可以继续。
  • synchronousasynchronous代码相反,因此是普通代码。
  • 最后,如果异步完全超出范围,那么您就不会强调同步这个词。

答案 1 :(得分:0)

顾名思义,它有助于同步线程。

考虑GCD异步和同步(伪)

的典型用法
async background_thread {
    //1 call webservice or other long task that would block the main thread

    sync main_thread {
        //2 update UI with results from 1
    }

    //3 do something else that relies on 2
}

现在,如果2处于异步中并且您需要在3处执行某些依赖于2处的更新的事情,那么您无法保证(并且很可能不会)获得您期望的行为。相反,您使用sync来确保在后台线程中继续执行之前完成任务。

如果您现在要问,为什么不在2左右取出同步/异步,以便它按顺序执行?问题是,UI不能在后台线程上更新,否则行为是未定义的(这通常意味着UI滞后很多)。所以实质上发生的是后台线程在2 {s} sync等待,直到主线程执行该块,然后它将继续执行后台线程上的其余执行。

如果你正在处理一个不需要主线程(或其他线程)正确执行的任务,那么你也可以在2点取出sync

这只是同步有用的一个示例,如果您在应用中进行高级线程,则还有其他示例。

希望这有帮助

答案 2 :(得分:0)

通常,这是因为您希望在特定的不同线程上执行操作,但您需要该操作的结果。您不能异步执行操作,因为您的代码将在另一个线程上的操作完成之前继续。

Apple有一个非常好的例子:

func asset() -> AVAsset? {
    var theAsset : AVAsset!
    self.assetQueue.sync {
        theAsset = self.getAssetInternal().copy() as! AVAsset
    }
    return theAsset
}

任何线程都可以调用asset方法;但为了避免共享数据出现问题,我们要求只有从特定队列(self.assetQueue)执行的函数才能触及AVAsset,因此当我们调用getAssetInternal时,我们会在self.assetQueue上执行此操作。但我们还需要通过调用getAssetInternal返回的结果;因此调用sync而不是async