সুইফ্টে, অ্যাসিঙ্ক্রোনাস কোডের জন্য OperationQueue
ব্যবহার করা বিশুদ্ধ নরকের মতো মনে হতে পারে কারণ, হুডের নীচে, তাদের সিঙ্ক্রোনাস কোডের সংকলন সম্পন্ন হলে Operations
সম্পূর্ণ বলে বিবেচিত হয়।
অন্য কথায়, নীচে বর্ণিত উদাহরণটি কম্পাইল করলে একটি ভাঙা এক্সিকিউশন অর্ডার আউটপুট হবে যেহেতু, অ্যাসিঙ্ক্রোনাস কোডটি কার্যকর করার সময়, Operation
ইতিমধ্যেই সম্পূর্ণ হয়ে গেছে।
let operationQueue = OperationQueue() operationQueue.maxConcurrentOperationCount = 1 operationQueue.addOperation { DispatchQueue.main.asyncAfter(deadline: .now() + 1) { print("First async operation complete") } print("First sync operation complete") } operationQueue.addOperation { DispatchQueue.main.asyncAfter(deadline: .now() + 1.5) { print("Second async operation complete") } print("Second sync operation complete") }
এই কোডটি প্রিন্ট করবে:
First sync operation complete Second sync operation complete First async operation complete Second async operation complete
যাইহোক, এই বিধিনিষেধগুলি অতিক্রম করার একটি উপায় আছে। কীভাবে সমস্যাটি সমাধান করা যায় তা বোঝার জন্য, আপনাকে বুঝতে হবে কিভাবে ফণার নিচে Operation
কাজ করে।
Operation
নিজেই চারটি পতাকা রয়েছে যার দ্বারা আপনি অপারেশনের জীবনচক্র ট্র্যাক করতে পারেন:
isReady
— নির্দেশ করে যে এই সময়ে Operation
করা যাবে কিনা।
isExecuting
— নির্দেশ করে যে একটি Operation
বর্তমানে চলছে কিনা।
isFinished
— নির্দেশ করে যে Operation
বর্তমানে সম্পন্ন হয়েছে কিনা।
isCancelled
— Operation
বাতিল করা হয়েছে কিনা তা নির্দেশ করে।
তাত্ত্বিকভাবে, Operation
অসিঙ্ক্রোনাসভাবে সম্পাদিত হওয়ার আগে Operation
isFinished
অবস্থায় প্রবেশ করে, তাই আমাদের এমন একটি কৌশল তৈরি করতে হবে যার মাধ্যমে আমরা Operation
জীবনচক্রকে পরিচালনা করতে সক্ষম হব।
এই সম্ভাবনার সমাধান করা যেতে পারে Operation
সাবক্লাসিং করে এবং start
/ cancel
পদ্ধতিগুলিকে পুনঃসংজ্ঞায়িত করে, সেইসাথে অপারেশনের জীবনচক্র যে সমস্ত ফ্ল্যাগের উপর তৈরি করা হয়েছে।
এখানে কোড আছে:
public class AsyncOperation: Operation { // MARK: Open override open var isAsynchronous: Bool { true } override open var isReady: Bool { super.isReady && self.state == .ready } override open var isExecuting: Bool { self.state == .executing } override open var isFinished: Bool { self.state == .finished } override open func start() { if isCancelled { state = .finished return } main() state = .executing } override open func cancel() { super.cancel() state = .finished } // MARK: Public public enum State: String { case ready case executing case finished // MARK: Fileprivate fileprivate var keyPath: String { "is" + rawValue.capitalized } } public var state = State.ready { willSet { willChangeValue(forKey: newValue.keyPath) willChangeValue(forKey: state.keyPath) } didSet { didChangeValue(forKey: oldValue.keyPath) didChangeValue(forKey: state.keyPath) } } }
Operation
থেকে আমরা যে সাবক্লাসটি পেয়েছি তা মৌলিক এবং আমাদের জোরপূর্বক এটিকে ম্যানুয়ালি সম্পূর্ণ করার অনুমতি দেয়।
সমাপ্তি ব্লকের সাথে কাজ করার জন্য, আপনাকে অন্য একটি সাবক্লাস তৈরি করা উচিত। যাইহোক, এটি Operation
একটি সাবক্লাস হবে না, তবে AsyncOperation
এর।
public typealias VoidClosure = () -> Void public typealias Closure<T> = (T) -> Void public class CompletionOperation: AsyncOperation { // MARK: Lifecycle public init(completeBlock: Closure<VoidClosure?>?) { self.completeBlock = completeBlock } // MARK: Public override public func main() { DispatchQueue.main.async { [weak self] in self?.completeBlock? { DispatchQueue.main.async { self?.state = .finished } } } } // MARK: Private private let completeBlock: Closure<VoidClosure?>? }
এই সাবক্লাসটি আমাদের Operation
বন্ধ করার অনুমতি দেবে, যার পরে Operation
সম্পন্ন হবে।
চলুন অনুশীলনে এই ধরনের অপারেশন চেষ্টা করুন:
let operationQueue = OperationQueue() operationQueue.maxConcurrentOperationCount = 1 operationQueue.addOperation( CompletionOperation { completion in DispatchQueue.main.asyncAfter(deadline: .now() + 1) { print("First async operation complete") completion?() } print("First sync operation complete") } ) operationQueue.addOperation( CompletionOperation { completion in DispatchQueue.main.asyncAfter(deadline: .now() + 1.5) { print("Second async operation complete") completion?() } print("Second sync operation complete") } )
ফলস্বরূপ, আমরা Operations
সিঙ্ক্রোনাস সম্পাদন করতে সক্ষম হয়েছি:
First sync operation complete First async operation complete Second sync operation complete Second async operation complete
আমার সাথে যোগাযোগ করতে দ্বিধা করবেন না
এছাড়াও এখানে প্রকাশিত