回答

1

以下是功能delay,即使在後臺狀態下也可以幫助您處理延遲(延遲將在應用程序變爲活動狀態後立即處理,如果時間正常的話)。而與此代碼,你可以在需要時輕鬆取消延遲但是,當應用程序沒有運行(這種情況下,我會給其他解決方案)這種解決方案將不會在情況下工作:

import Foundation 
import UIKit 

typealias dispatch_cancelable_closure = (_ cancel : Bool) -> Void 

@discardableResult 
func delay(_ time:TimeInterval, closure: @escaping()->Void) -> dispatch_cancelable_closure? { 

// DispatchQueue.main.asyncAfter(deadline: .now() + .milliseconds(Int(time * 1000))) { 
//  closure() 
// } 
//  
// return nil 

    func dispatch_later(_ clsr:@escaping()->Void) { 
     DispatchQueue.main.asyncAfter(
      deadline: DispatchTime.now() + Double(Int64(time * Double(NSEC_PER_SEC)))/Double(NSEC_PER_SEC), execute: clsr) 
    } 

    var closure:(()->Void)? = closure 
    var cancelableClosure:dispatch_cancelable_closure? 

    let delayedClosure:dispatch_cancelable_closure = { cancel in 
     if closure != nil { 
      if (cancel == false) { 
//    DispatchQueue.main.async { 
//     closure?() 
//    } 
       DispatchQueue.main.async(execute: closure!) 
//    DispatchQueue.main.async(execute: closure as! @convention(block)() -> Void); 
      } 
     } 
     closure = nil 
     cancelableClosure = nil 
    } 

    cancelableClosure = delayedClosure 

    dispatch_later { 
     if let delayedClosure = cancelableClosure { 
      delayedClosure(false) 
     } 
    } 

    return cancelableClosure; 
} 

func cancel_delay(_ closureToCancel:dispatch_cancelable_closure?) { 

    if closureToCancel != nil { 
     closureToCancel!(true) 
    } 
} 

但是情況下,當你應用程序未運行,您需要在應用程序進入後臺之前節省您在NSDefaults中刪除單元格的時間,並且當應用程序變爲活動狀態時,您可以使用此延遲功能來設置其餘時間(或者如果時間已過期可以靈活移除細胞)

相關問題