paint-brush
OperationQueue + অ্যাসিঙ্ক্রোনাস কোড: আপনার যা কিছু জানা দরকারদ্বারা@bugorbn
528 পড়া
528 পড়া

OperationQueue + অ্যাসিঙ্ক্রোনাস কোড: আপনার যা কিছু জানা দরকার

দ্বারা Boris Bugor5m2024/03/17
Read on Terminal Reader

অতিদীর্ঘ; পড়তে

সুইফটে, সিঙ্ক্রোনাস কোডের জন্য একটি অপারেশন সারি ব্যবহার করা বিশুদ্ধ নরকের মতো মনে হতে পারে কারণ, হুডের নিচে, কোডটি সম্পূর্ণ বলে বিবেচিত হয় যদি তাদের কোডের সংকলন সম্পন্ন হয়। অ্যাসিঙ্ক্রোনাস কোডটি কার্যকর করার সময়, `অপারেশন` ইতিমধ্যে সম্পূর্ণ হয়ে যাবে। সমস্যাটি কীভাবে সমাধান করা যায় তা বোঝার জন্য, আপনাকে বুঝতে হবে কিভাবে অপারেশনের জীবনচক্র কাজ করে।
featured image - OperationQueue + অ্যাসিঙ্ক্রোনাস কোড: আপনার যা কিছু জানা দরকার
Boris Bugor HackerNoon profile picture

সুইফ্টে, অ্যাসিঙ্ক্রোনাস কোডের জন্য 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 বর্তমানে সম্পন্ন হয়েছে কিনা।


  • isCancelledOperation বাতিল করা হয়েছে কিনা তা নির্দেশ করে।


তাত্ত্বিকভাবে, 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


আমার সাথে যোগাযোগ করতে দ্বিধা করবেন না টুইটার যদি আপনার কোন প্রশ্ন থাকে তাহলে. এছাড়াও, আপনি সবসময় করতে পারেন আমাকে একটা কফি কিনে দাও .


এছাড়াও এখানে প্রকাশিত