আমি কিভাবে সুইচ 3, সুইফট 4 এবং এর বাইরেও প্রেরণ_সৃজন, প্রেরণ_প্রেরণক, প্রেরণ_পরিবর্তন ইত্যাদি করব?


243

আমার কাছে সুইফট ২.x (বা এমনকি 1.x) প্রকল্পগুলিতে প্রচুর কোড রয়েছে যা দেখতে দেখতে:

// Move to a background thread to do some long running work
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)) {
    let image = self.loadOrGenerateAnImage()
    // Bounce back to the main thread to update the UI
    dispatch_async(dispatch_get_main_queue()) {
        self.imageView.image = image
    }
}

বা কার্যকর কার্যকর করতে বিলম্ব করার মতো জিনিস:

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, Int64(0.5 * Double(NSEC_PER_SEC))), dispatch_get_main_queue()) {
    print("test")
}

বা গ্র্যান্ড সেন্ট্রাল ডিসপ্যাচ এপিআই এর অন্য কোনও ধরণের ব্যবহার ...

এখন যে আমি সুইফট 3 এর জন্য এক্সকোড 8 (বিটা) এ আমার প্রকল্পটি খুলেছি, আমি সমস্ত ধরণের ত্রুটি পেয়েছি। তাদের মধ্যে কিছু আমার কোডটি ঠিক করার প্রস্তাব দেয় তবে সমস্ত ফিক্সই ওয়ার্কিং কোড তৈরি করে না। আমি এই সম্পর্কে কি করব?


এখানে উত্তর: stackoverflow.com/questions/37805885/...
t1ser

উত্তর:


343

শুরু থেকেই, সুইফট ওবিজেসি এবং সি আরও সুইফটি তৈরির জন্য কয়েকটি সুবিধা সরবরাহ করেছে, প্রতিটি সংস্করণে আরও যুক্ত করে। এখন, সুইফ্ট 3-এ নতুন "আমদানি সদস্য হিসাবে" বৈশিষ্ট্যটি সি এপিআই-র নির্দিষ্ট স্টাইলের ফ্রেমওয়ার্কগুলি দেয় - যেখানে আপনার কাছে এমন ডেটা টাইপ রয়েছে যা শ্রেণীর মতো ধরণের কাজ করে, এবং এটিতে কাজ করার জন্য একগুচ্ছ বৈশ্বিক ফাংশন - আরও বেশি সুইফট-নেটিভ এপিআইয়ের মতো কাজ করুন। ডেটা প্রকারগুলি সুইফ্ট শ্রেণি হিসাবে আমদানি করে, তাদের সম্পর্কিত বিশ্বব্যাপী ফাংশনগুলি সেই শ্রেণীর উপর পদ্ধতি এবং বৈশিষ্ট্য হিসাবে আমদানি করে এবং কিছু সম্পর্কিত জিনিস যেমন সেটগুলির ধরণের সেট সাব-টাইপ হয়ে উঠতে পারে।

এক্সকোড 8 / সুইফ্ট 3 বিটাতে, ডিসপ্যাচ কাঠামোটিকে আরও বেশি সুইফটি তৈরি করতে অ্যাপল এই বৈশিষ্ট্যটি (কয়েকজনকে সাথে নিয়ে) প্রয়োগ করেছে। (এবং কোর গ্রাফিকসও ।) আপনি যদি সুইফট ওপেন সোর্স প্রচেষ্টা অনুসরণ করে থাকেন তবে এটি কোনও সংবাদ নয় , তবে এখন এটি প্রথমবারের মতো এটি এক্সকোডের অংশ।

যে কোনও প্রকল্পকে সুইফট 3 এ স্থানান্তরিত করার জন্য আপনার প্রথম পদক্ষেপটি এটি Xcode 8 এ খুলতে হবে এবং মেনুতে সম্পাদনা> রূপান্তর> বর্তমান সুইফ্ট সিনট্যাক্সে ... নির্বাচন করতে হবে । এটি পুনরায় নামকরণকৃত API এবং অন্যান্য পরিবর্তনের জন্য একবারে প্রয়োজনীয় সমস্ত পরিবর্তনগুলি (আপনার পর্যালোচনা এবং অনুমোদনের সাথে) প্রয়োগ করবে। (প্রায়শই, কোডগুলির একটি লাইন একবারে এই পরিবর্তনগুলির একের বেশি দ্বারা প্রভাবিত হয়, তাই ত্রুটি সংশোধন করার প্রতিক্রিয়া - এর স্বতন্ত্রভাবে সবকিছু ঠিকঠাক পরিচালনা করতে পারে না))

ফলাফলটি যে ব্যাকগ্রাউন্ডে এবং পিছনে কাজ স্থির করার জন্য সাধারণ প্যাটার্নটি এখন এর মতো দেখায়:

// Move to a background thread to do some long running work
DispatchQueue.global(qos: .userInitiated).async {
    let image = self.loadOrGenerateAnImage()
    // Bounce back to the main thread to update the UI
    DispatchQueue.main.async {
        self.imageView.image = image
    }
}

নোট করুন আমরা .userInitiatedপুরানো DISPATCH_QUEUE_PRIORITYকনস্ট্যান্টগুলির পরিবর্তে একটি ব্যবহার করছি । ওএস এক্স 10.10 / আইওএস 8.0-এ কোয়ালিটি অফ সার্ভিস (কিউওএস) স্পেসিফায়ার প্রবর্তন করা হয়েছিল, সিস্টেমকে কাজের অগ্রাধিকার দেওয়ার এবং পুরাতন অগ্রাধিকারের স্পেসিফায়ারদের অবমূল্যায়নের একটি সুস্পষ্ট উপায় সরবরাহ করে। বিবরণের জন্য পটভূমি কাজ এবং শক্তির দক্ষতার বিষয়ে অ্যাপলের ডক্স দেখুন ।

যাইহোক, আপনি যদি কাজটি সংগঠিত করার জন্য নিজের কাতারে রাখেন তবে এখন পাওয়ার উপায়টি দেখতে এই জাতীয় দেখাচ্ছে (লক্ষ্য করুন এটি DispatchQueueAttributesএকটি OptionSet, সুতরাং আপনি বিকল্পগুলি একত্রিত করার জন্য সংগ্রহ-শৈলীর আক্ষরিক ব্যবহার করেন):

class Foo { 
    let queue = DispatchQueue(label: "com.example.my-serial-queue",
                           attributes: [.serial, .qosUtility])
    func doStuff() {
        queue.async {
            print("Hello World")
        }
    }
}

dispatch_afterপরে কাজ করতে ব্যবহার করছেন? এটি কাতারেও একটি পদ্ধতি এবং এটির একটি লাগে DispatchTimeযা বিভিন্ন সংখ্যার জন্য অপারেটর রয়েছে যাতে আপনি কেবল পুরো বা ভগ্নাংশের সেকেন্ড যুক্ত করতে পারেন:

DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) { // in half a second...
    print("Are we there yet?")
}

এক্সকোড ৮-এ এর ইন্টারফেসটি খোলার মাধ্যমে আপনি নতুন ডিসপ্যাচ এপিআই DispatchQueue-এর আশেপাশে আপনার পথটি খুঁজে পেতে পারেন - ডিসপ্যাচ মডিউলটি সন্ধান করতে দ্রুত খুলুন ব্যবহার করুন বা আপনার সুইফট প্রকল্প / খেলার মাঠে একটি চিহ্ন (যেমন ) রাখুন এবং তারপরে কমান্ড-ক্লিক করুন, তারপরে ব্রাউস করুন সেখান থেকে মডিউল। (আপনি অ্যাপলের স্পাইফাই নতুন এপিআই রেফারেন্স ওয়েবসাইট এবং ইন-এক্সকোড ডক ভিউয়ারে স্যুইফ্ট ডিসপ্যাচ এপিআই খুঁজে পেতে পারেন তবে দেখে মনে হচ্ছে যে সি সংস্করণ থেকে ডক সামগ্রীটি এখনও এটিতে স্থানান্তরিত হয়নি))

দেখুন মাইগ্রেশন গাইড আরো টিপসের জন্য।


3
এক্সকোড 8 বিটা 6 এর জন্য, .সিরিয়াল বৈশিষ্ট্যটি চলে গেছে এবং ডিফল্ট আচরণ - forums.developer.apple.com/message/159457#159457
hyuuu

6
এক্সকোড ৮.১ এর পরে এটির জন্য একটি আপডেট দরকার .. অ্যাট্রিবিউটস লেবেল অদৃশ্য হয়ে গেছে এবং এর জায়গায় আমরা 'ডিসপ্যাচকুইউ দ্যোবাল (কিউস: .ব্যাকগ্রাউন্ড) ব্যবহার করতে পারি asyসিঙ্ক'
মাইক এম

2
অসাধারণ উত্তর। সত্যই আমার চারপাশে আমার মাথা পেতে সাহায্য করেছিল।
মহসিন খুবাইব আহমেদ

এর qos:পরিবর্তে আমাকে ব্যবহার করতে হয়েছিলattributes:
ইসলাম কিউ

myQueue.async {এটা class Fooউদাহরণ হতে হবে না ?
ভ্যাকোয়ামা

142

এক্সকোডে 8 বিটা 4 কাজ করে না ...

ব্যবহার করুন:

DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) {
    print("Are we there yet?")
}

অ্যাসিঙ্কের দুটি উপায়ে:

DispatchQueue.main.async {
    print("Async1")
}

DispatchQueue.main.async( execute: {
    print("Async2")
})

সুতরাং এটি ইউআই অবরুদ্ধ করে না?
ব্যবহারকারী 25

72

এটি Swift 4সম্পর্কে একটি ভাল উদাহরণ async:

DispatchQueue.global(qos: .background).async {
    // Background Thread
    DispatchQueue.main.async {
        // Run UI Updates or call completion block
    }
}

হাই DispatchQueue.main.async {// রান ইউআই আপডেটস background ব্যাকগ্রাউন্ড থ্রেডের পূর্বে কার্যকর করা হচ্ছে
উমা আচান্তা



26

সুইফ্ট 5.2, 4 এবং তারপরে

প্রধান এবং পটভূমি সারি

let main = DispatchQueue.main
let background = DispatchQueue.global()
let helper = DispatchQueue(label: "another_thread") 

অ্যাসিঙ্ক এবং সিঙ্ক থ্রেডের সাথে কাজ করা !

 background.async { //async tasks here } 
 background.sync { //sync tasks here } 

মূল থ্রেডের সাথে অ্যাসিঙ্ক থ্রেডগুলিও কাজ করবে।

সিঙ্ক থ্রেডগুলি কার্যকর করার সময় মূল থ্রেডটি ব্লক করবে।


1
এবং আপনি কীভাবে মূল থ্রেড (ইউআই) অবরুদ্ধ না করে সিঙ্ক থ্রেড ব্যবহার করবেন ?? আমি ব্যাকগ্রাউন্ডে জিনিসগুলির সারি নির্বাহ করতে চাই - তবে এই জিনিসগুলি একের পর এক সিঙ্ক পদ্ধতিতে কার্যকর করতে হবে। এই সময়ের মধ্যে ইউআইয়ের প্রতিক্রিয়া থাকা উচিত .... আপনি কীভাবে তা করবেন?
আইকেকে

NSOperationQueue ব্যবহার করুন। যা আপনার প্রতিটি কাজ একটি এনএসওপ্রেশন প্রতিনিধিত্ব করে। পড়ুন stackoverflow.com/a/19746890/5215474
Saranjith

12

সুইট ৪.১ এবং ৫. আমরা আমাদের কোডে অনেক জায়গায় সারি ব্যবহার করি। সুতরাং, আমি সমস্ত সারি দিয়ে থ্রেডস ক্লাস তৈরি করেছি। আপনি যদি থ্রেডস ক্লাস ব্যবহার করতে না চান তবে আপনি ক্লাসের পদ্ধতিগুলি থেকে কাঙ্ক্ষিত কিউ কোডটি অনুলিপি করতে পারেন।

class Threads {

  static let concurrentQueue = DispatchQueue(label: "AppNameConcurrentQueue", attributes: .concurrent)
  static let serialQueue = DispatchQueue(label: "AppNameSerialQueue")

  // Main Queue
  class func performTaskInMainQueue(task: @escaping ()->()) {
    DispatchQueue.main.async {
      task()
    }
  }

  // Background Queue
  class func performTaskInBackground(task:@escaping () throws -> ()) {
    DispatchQueue.global(qos: .background).async {
      do {
        try task()
      } catch let error as NSError {
        print("error in background thread:\(error.localizedDescription)")
      }
    }
  }

  // Concurrent Queue
  class func perfromTaskInConcurrentQueue(task:@escaping () throws -> ()) {
    concurrentQueue.async {
      do {
        try task()
      } catch let error as NSError {
        print("error in Concurrent Queue:\(error.localizedDescription)")
      }
    }
  }

  // Serial Queue
  class func perfromTaskInSerialQueue(task:@escaping () throws -> ()) {
    serialQueue.async {
      do {
        try task()
      } catch let error as NSError {
        print("error in Serial Queue:\(error.localizedDescription)")
      }
    }
  }

  // Perform task afterDelay
  class func performTaskAfterDealy(_ timeInteval: TimeInterval, _ task:@escaping () -> ()) {
    DispatchQueue.main.asyncAfter(deadline: (.now() + timeInteval)) {
      task()
    }
  }
}

প্রধান সারি ব্যবহার দেখানো উদাহরণ।

override func viewDidLoad() {
    super.viewDidLoad()
     Threads.performTaskInMainQueue {
        //Update UI
    }
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.