真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

IOS開發(fā)中延遲執(zhí)行和取消的示例分析-創(chuàng)新互聯(lián)

這篇文章主要為大家展示了“IOS開發(fā)中延遲執(zhí)行和取消的示例分析”,內(nèi)容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領(lǐng)大家一起研究并學(xué)習(xí)一下“IOS開發(fā)中延遲執(zhí)行和取消的示例分析”這篇文章吧。

成都一家集口碑和實(shí)力的網(wǎng)站建設(shè)服務(wù)商,擁有專業(yè)的企業(yè)建站團(tuán)隊(duì)和靠譜的建站技術(shù),10多年企業(yè)及個(gè)人網(wǎng)站建設(shè)經(jīng)驗(yàn) ,為成都數(shù)千家客戶提供網(wǎng)頁設(shè)計(jì)制作,網(wǎng)站開發(fā),企業(yè)網(wǎng)站制作建設(shè)等服務(wù),包括成都營銷型網(wǎng)站建設(shè),品牌網(wǎng)站建設(shè),同時(shí)也為不同行業(yè)的客戶提供網(wǎng)站制作、成都做網(wǎng)站的服務(wù),包括成都電商型網(wǎng)站制作建設(shè),裝修行業(yè)網(wǎng)站制作建設(shè),傳統(tǒng)機(jī)械行業(yè)網(wǎng)站建設(shè),傳統(tǒng)農(nóng)業(yè)行業(yè)網(wǎng)站制作建設(shè)。在成都做網(wǎng)站,選網(wǎng)站制作建設(shè)服務(wù)商就選成都創(chuàng)新互聯(lián)。

在 Objective-C 中延遲執(zhí)行還是很常見的需求,通常有如下幾種方式可供選擇:

performSelector:

想要延遲調(diào)用某個(gè)方法:

[self performSelector:@selector(delay) withObject:nil afterDelay:3.0];

取消延遲的方法:

[NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(delay) object:nil];

這里需要注意參數(shù)需要保持一致,否則取消失敗。

NSTimer

想要延遲調(diào)用某個(gè)方法:

self.timer = [NSTimer scheduledTimerWithTimeInterval:2.0 target:self selector:@selector(delay) userInfo:nil repeats:NO];

取消延遲的方法:

[self.timer invalidate];
GCD

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
    // ...
});

dispatch_after 是比較常用的方法,但是 Objective-C 中并沒有提供取消執(zhí)行的相關(guān) API。我們只能自己實(shí)現(xiàn)這個(gè)取消的邏輯:

typedef void (^Task)(BOOL cancel);
Task delay(NSTimeInterval time,void (^task)()) {
  __block void (^closure)() = task;
  __block Task result;
  Task delayedClosure = ^(BOOL cancel){
    if (closure) {
      void (^internalClosure)() = closure;
      if (!cancel) {
        dispatch_async(dispatch_get_main_queue(), internalClosure);
      }
    }
    closure = nil;
    result = nil;
  };
  
  result = delayedClosure;
  
  dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(time * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
    if (delayedClosure) {
      delayedClosure(NO);
    }
  });
  return result;
}
使用的話可以這樣:

delay(60, ^{
  // ...
});

如果想要延遲,可以先聲明成成員變量并賦值:

@property (copy, nonatomic) Task task;
self.task = delay(60, ^{
  // ...
});

最后在需要的地方取消就行:

self.task(YES);

這種寫法的核心思想是根據(jù)傳入的 Bool 值,來控制 dispatch_after 回調(diào) block 中的方法是否需要執(zhí)行??雌饋硎侨∠?,但實(shí)際上還是被 GCD 放到 RunLoop 里去占用主線程資源了。

dispatch_source

我們還可以利用 dispatch_source 中的定時(shí)器,來實(shí)現(xiàn)延時(shí)/取消操作:

@property (strong, nonatomic) dispatch_source_t timer;
// 隊(duì)列
dispatch_queue_t queue = dispatch_get_main_queue();
// 創(chuàng)建 dispatch_source
dispatch_source_t timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, queue);
// 聲明成員變量
self.timer = timer;
// 設(shè)置兩秒后觸發(fā)
dispatch_time_t startTime = dispatch_time(DISPATCH_TIME_NOW, 3.0 * NSEC_PER_SEC);
// 設(shè)置下次觸發(fā)事件為 DISPATCH_TIME_FOREVER
dispatch_time_t nextTime = DISPATCH_TIME_FOREVER;
// 設(shè)置精確度
dispatch_time_t leeway = 0.1 * NSEC_PER_SEC;
// 配置時(shí)間
dispatch_source_set_timer(timer, startTime, nextTime, leeway);
// 回調(diào)
dispatch_source_set_event_handler(timer, ^{
  // ...
});
// 激活
dispatch_resume(timer);

需要取消的話:

dispatch_source_cancel(self.timer);

以上是“IOS開發(fā)中延遲執(zhí)行和取消的示例分析”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)網(wǎng)站建設(shè)公司行業(yè)資訊頻道!

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)建站www.cdcxhl.com,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。


文章題目:IOS開發(fā)中延遲執(zhí)行和取消的示例分析-創(chuàng)新互聯(lián)
網(wǎng)頁URL:http://weahome.cn/article/gojis.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部