답변

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의 셀을 제거하려는 시간을 저장해야하며 응용 프로그램이 활성화되면이 지연 기능을 사용하여 나머지 시간을 설정하거나 시간이 만료되면 셀을 즉시 제거 할 수 있음)