কীভাবে সুইফট 3-এ প্রেরণের সারি তৈরি করা যায়


403

সুইফট 2-এ, আমি নিম্নলিখিত কোডের সাথে সারি তৈরি করতে সক্ষম হয়েছি:

let concurrentQueue = dispatch_queue_create("com.swift3.imageQueue", DISPATCH_QUEUE_CONCURRENT)

তবে এটি সুইফ্ট 3-এ সংকলন করে না।

সুইফট 3 এ লেখার পছন্দের উপায়টি কী?



সিরিয়াল সারি তৈরি করতে সুইফট 4-তে 3 অতিরিক্ত প্যারাম রয়েছে। সিরিয়াল সারি তৈরি করতে কীভাবে এগুলি ব্যবহার করবেন? DispatchQueue.init (লেবেল:, qos:, বৈশিষ্ট্য:, স্বতঃসংশোধন:, লক্ষ্য:)
এনআর 5

@ এনআর 5 ক্যুগুলি ডিফল্টরূপে সিরিয়াল, সুতরাং এটি কেবল DispatchQueue(label: "your-label")একটি সিরিয়াল কাতারে ব্যবহারের জন্য যথেষ্ট । অতিরিক্ত প্যারামগুলির সকলেরই ডিফল্ট মান থাকে।
jbg

উত্তর:


1131

একযোগে সারি তৈরি করা হচ্ছে

let concurrentQueue = DispatchQueue(label: "queuename", attributes: .concurrent)
concurrentQueue.sync {

}  

একটি ক্রমিক সারি তৈরি করুন

let serialQueue = DispatchQueue(label: "queuename")
serialQueue.sync { 

}

অ্যাসিক্রোনালিকভাবে মূল সারি পান

DispatchQueue.main.async {

}

সিঙ্ক্রোনালি মুখ্য সারি পান

DispatchQueue.main.sync {

}

একটি পটভূমি থ্রেড পেতে

DispatchQueue.global(qos: .background).async {

}

এক্সকোড 8.2 বিটা 2:

একটি পটভূমি থ্রেড পেতে

DispatchQueue.global(qos: .default).async {

}

DispatchQueue.global().async {
    // qos' default value is ´DispatchQoS.QoSClass.default`
}

আপনি যদি এই সারিগুলি ব্যবহার সম্পর্কে শিখতে চান তবে এই উত্তরটি দেখুন


3
আপনি আসলে বর্জন করতে attributes: .serialযখন একটি সিরিয়াল কিউ তৈরি: let serialQueue = DispatchQueue(label: "queuename")
kean

15
এক্সকোড 8 বিটা 4-তে কোনও .সিরিয়াল বিকল্প নেই তাই আপনাকে বৈশিষ্ট্যগুলিতে .কালীন বাদ দিয়ে ক্রমিক সারি তৈরি করতে হবে।
ওলেগ শেরম্যান

আমাকে সুইফট 3 থেকে অবজেক্টে ডিসপ্যাচকিউ অ্যাক্সেস করতে হবে তবে নিম্নলিখিত ত্রুটিটি পেয়েছে 'ওএস_ডিস্পাচ_কুই_উইউ _ ননুল' টাইপ করার ব্যপারের ব্যাকগ্রাউন্ডের সাথে '__স্ট্রং ডিসপ্যাচ_কিউ_আরএফ' এনএসওবজেক্ট <OS_dispatch_queue * __nnull 'টাইপের একটি পরিবর্তনশীল আরম্ভ করা যায় না = [সুইফট ক্লাস ক্যু]; এটি দ্রুতগতিতে ডিসপ্যাচকিউয়ের স্থিতিশীল পরিবর্তনশীল
আদর্শ

DispatchQueue.main.asynchronously (DispatchQueue.main) {self.mapView.add (স্বয়ং। .ম্যাপপলাইন)} তবে উভয়ই একই ত্রুটিটি দেখায় যে "টাইপ দ্য ডিসপ্যাথকুই'র কোনও সদস্যই অবিচ্ছিন্নভাবে থাকে না"
আবীরামি বাল

1
ওপির কোড থেকে, কেন অ্যাপল "com.swift3.imageQueue" ব্যবহারের দিকে কেন দৃষ্টি নিবদ্ধ করে । আমি দেখতে পাচ্ছি যে লেবেলের 3 টি অংশ রয়েছে। কেন এমন? প্রতিটি অংশ কি জন্য দাঁড়িয়ে? আমি ফর্ম্যাটিংটি পাই না
মধু

55

> = সুইফট 3 এর অধীন সংকলিত । এই উদাহরণটিতে আমাদের প্রয়োজনীয় সিনট্যাক্সের বেশিরভাগ অংশ রয়েছে।

QoS - পরিষেবা সিনট্যাক্সের নতুন মানের

weak self - ধরে রাখা চক্র ব্যাহত

যদি স্ব উপলব্ধ না হয় তবে কিছুই করবেন না

async global utility queue- নেটওয়ার্ক ক্যোয়ারির জন্য, ফলাফলটির জন্য অপেক্ষা না করে, এটি একটি যুগপত সারি, ব্লকটি (সাধারণত) কখন শুরু হয় তা অপেক্ষা করে না। সমবর্তী সারির ব্যতিক্রম হতে পারে, যখন এর কার্য সীমাটি পূর্বে পৌঁছে গিয়েছে, তারপরে এই সারিটি সাময়িকভাবে ক্রমিক সারিতে পরিণত হয় এবং সেই সারিটির পূর্ববর্তী কিছু কাজ শেষ না হওয়া পর্যন্ত অপেক্ষা করে।

async main queue- ইউআই স্পর্শ করার জন্য, ব্লকটি ফলাফলটির জন্য অপেক্ষা করে না, তবে শুরুতে এটির স্লটের জন্য অপেক্ষা করে। মূল সারিটি ক্রমিক সারি।

অবশ্যই, আপনাকে এটি পরীক্ষা করতে কিছু ত্রুটি যুক্ত করতে হবে ...

DispatchQueue.global(qos: .utility).async { [weak self] () -> Void in

    guard let strongSelf = self else { return }

    strongSelf.flickrPhoto.loadLargeImage { loadedFlickrPhoto, error in

        if error != nil {
            print("error:\(error)")
        } else {
            DispatchQueue.main.async { () -> Void in
                activityIndicator.removeFromSuperview()
                strongSelf.imageView.image = strongSelf.flickrPhoto.largeImage
            }
        }
    }
}

6
সুইফট 3-এ কোডিং করার সময়, আপনার পূর্ববর্তী কোডের 30% ঘনীভূতকরণ এবং মুছতে অভ্যস্ত হন :-)
t1ser

[দুর্বল স্ব] উদাহরণের জন্য আপনাকে ধন্যবাদ!

1
এটা তোলে ভালো guardযে selfনয় nil, যাতে কোড কেউই এটা যদি মৃত্যুদন্ড কার্যকর করা হয় উপরের, nil, যেমন, guard strongSelf = self else { return }
স্কট গার্ডনার

@ t1 আপনি কি আমাকে বলতে পারবেন আমি সুইফট 3-তে কোড সহ জিসিডির জন্য ডকুমেন্টেশন কোথায় পেতে পারি? আমি কেবলমাত্র উদ্দেশ্য সি তে রচিত একটিটি পেয়েছি । এখানে কেউ আমাকে ডাব্লুডাব্লুডিসি থেকে একটি ভিডিওতে ইশারা করছিলেন তবে আমি সুইফট 3-তে উদাহরণ সহ অফিসিয়াল ডকুমেন্টেশন পড়তে চাই এবং এটি খুঁজে পাওয়ার কোনও উপায় নেই।
বাইবেল

1
.global(qos: .background)আইও (নেটওয়ার্কের অনুরোধ) এর জন্য ব্যবহার করবেন না । ব্যবহার করুন .global(qos: .default)অথবা .global(qos: .utility)পরিবর্তে।
পেড্রো পাওলো

28

এক্সকোড 8 তে সংকলিত, সুইফট 3 https://github.com/rpthomas/Jedisware

 @IBAction func tap(_ sender: AnyObject) {

    let thisEmail = "emailaddress.com"
    let thisPassword = "myPassword" 

    DispatchQueue.global(qos: .background).async {

        // Validate user input

        let result = self.validate(thisEmail, password: thisPassword)

        // Go back to the main thread to update the UI
        DispatchQueue.main.async {
            if !result
            {
                self.displayFailureAlert()
            }

        }
    }

}

12

যেহেতু ওপি প্রশ্নের উত্তর ইতিমধ্যে উপরে দেওয়া হয়েছে আমি কেবল কিছু গতি বিবেচনা যুক্ত করতে চাই:

এটি DispatchQueue.global- এ আপনার অ্যাসিঙ্ক ফাংশনটিতে কোন অগ্রাধিকার শ্রেণি নির্ধারণ করে তা অনেকটা তত্পর করে

আমি। ব্যাকগ্রাউন্ড দিয়ে কাজগুলি চালানোর প্রস্তাব দিই না থ্রেড অগ্রাধিকারের সাথে বিশেষত আইফোন এক্স যেখানে টাস্কটি কম পাওয়ার কোরে বরাদ্দ করা হয়েছে বলে মনে হচ্ছে তা ।

এটি একটি কম্পিউটেশনাল ইনটেনসিভ ফাংশন থেকে কিছু আসল তথ্য যা একটি এক্সএমএল ফাইল (বাফারিং সহ) থেকে পড়ে এবং ডেটা ইন্টারপোলেশন সম্পাদন করে:

ডিভাইস নাম / .background / .utility / .default / .userInitiated / .userInteractive

  1. আইফোন এক্স: 18.7 এস / 6.3 এস / 1.8 এস / 1.8 এস / 1.8 এস
  2. আইফোন 7: 4.6 এস / 3.1 এস / 3.0 এস / 2.8 এস / 2.6 এস
  3. আইফোন 5 এস: 7.3 এস / 6.1 এস / 4.0 এস / 4.0 এস / 3.8 এস

নোট করুন যে ডেটা সেটটি সমস্ত ডিভাইসের জন্য এক নয়। এটি আইফোন এক্সের মধ্যে বৃহত্তম এবং আইফোন 5 এস এর মধ্যে সবচেয়ে ছোট।


1
দুর্দান্ত তথ্য। আমাকে সহায়তা করেছে
মর্জজ

1
@ মাইকি যদি ব্যবহারকারী সূচনা করে থাকেন এবং / অথবা এটি আপনার ফলাফলের জন্য অপেক্ষা করছে তবে .userInitiated বা .userInteractive যাতে অন্য কোনও ক্রিয়াকলাপ ব্যাকট্র্যাক হয়। অন্যান্য বেশিরভাগ ক্ষেত্রে .ডিফল্ট একটি ভাল পছন্দ হবে।
কসমিন

6

আমি এটি করেছি এবং এটি বিশেষত গুরুত্বপূর্ণ যদি আপনি ইউআইটিবেলভিউ বা ইউআইপিকারভিউয়ের মতো ব্যবহারকারীর নজরে না রেখে নতুন তথ্য দেখানোর জন্য আপনার ইউআইকে রিফ্রেশ করতে চান।

    DispatchQueue.main.async
 {
   /*Write your thread code here*/
 }

3
 DispatchQueue.main.async {
          self.collectionView?.reloadData() // Depends if you were populating a collection view or table view
    }


OperationQueue.main.addOperation {
    self.lblGenre.text = self.movGenre
}

// যদি আপনার ভিউকন্ট্রোলারের উপর অবজেক্টগুলি (লেবেল, চিত্রদর্শন, পাঠ্যদর্শন) পপুলেশন করা দরকার হয় তবে অপারেশন সারি ব্যবহার করুন


2
   let concurrentQueue = dispatch_queue_create("com.swift3.imageQueue", DISPATCH_QUEUE_CONCURRENT) //Swift 2 version

   let concurrentQueue = DispatchQueue(label:"com.swift3.imageQueue", attributes: .concurrent) //Swift 3 version

আমি আপনার কোডটি এক্সকোড 8, সুইফট 3 এ পুনরায় কাজ করেছি এবং পরিবর্তনগুলি আপনার সুইফট 2 সংস্করণের বিপরীতে চিহ্নিত হয়েছে।


আমি যা লিখেছি তার থেকে এটি পরিষ্কার দেখাচ্ছে। ধন্যবাদ।
gosborne3

2

সুইফট 3

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

তবে আপনি প্রেরণ পদ্ধতিটি ব্যবহার করতে চান আপনার অ্যাপ্লিকেশন ক্রাশ হবে না

অ্যাসিঙ্ক পদ্ধতি

DispatchQueue.main.async 
{
 //Write code here                                   

}

সিঙ্ক পদ্ধতি

DispatchQueue.main.sync 
{
     //Write code here                                  

}

আমার কোডটি ডিসপ্যাচকিউ.ইমেন.সিএনসিএল হিসাবে পরিষেবা কল করার সময় আমি অ্যাসিঙ্ক পদ্ধতিটি ব্যবহার করতে চাই {আসুন stজেস্টরি 1 = সেলফ স্টোরবোর্ড? .InsttiateViewController (আইডেন্টিফায়ার সহ: "হোমভিউ কনট্রোলার") হিসাবে! হোমভিউকন্ট্রোলার _ = স্ব.নিভিশনকন্ট্রোলার? .পুশভিউ কনট্রোলার (অবজেক্টরি 1, অ্যানিমেটেড: মিথ্যা)}
Amul4608

1
কখনও ব্যবহার করবেন নাDispatchQueue.main.sync
ট্রিকস্টার

মূল কাতারে সিঙ্ক কলগুলি অবশ্যই সমস্যা তৈরি করবে।
তোফু ওয়ারিয়র

2
DispatchQueue.main.async(execute: {

// write code

})

ক্রমিক সারি:

let serial = DispatchQueue(label: "Queuename")

serial.sync { 

 //Code Here

}

একযোগে সারি:

 let concurrent = DispatchQueue(label: "Queuename", attributes: .concurrent)

concurrent.sync {

 //Code Here
}

এটি কোনও প্রেরণের সারি তৈরি করে না, রান লুপের মাধ্যমে এক টিক দেওয়ার পরে এটি আপনাকে মূল কাতারে রাখে।



1

সুইফট 5 এর জন্য আপডেট

ক্রমিক সারিবদ্ধ

let serialQueue = DispatchQueue.init(label: "serialQueue")
serialQueue.async {
    // code to execute
}

একযোগে সারি

let concurrentQueue = DispatchQueue.init(label: "concurrentQueue", qos: .background, attributes: .concurrent, autoreleaseFrequency: .inherit, target: nil)

concurrentQueue.async {
// code to execute
}

অ্যাপল ডকুমেন্টেশন থেকে :

পরামিতি

লেবেল

ডিবাগিং সরঞ্জামগুলিতে যেমন ইনস্ট্রুমেন্টস, নমুনা, স্ট্যাকশটস এবং ক্র্যাশ প্রতিবেদনে এটি অনন্যভাবে সনাক্ত করতে কাতারে যুক্ত একটি স্ট্রিং লেবেল। অ্যাপ্লিকেশন, গ্রন্থাগার এবং ফ্রেমওয়ার্কগুলি তাদের নিজস্ব প্রেরণের সারি তৈরি করতে পারে বলে একটি বিপরীত-ডিএনএস নামকরণ শৈলী (com.example.myqueue) বাঞ্ছনীয়। এই প্যারামিটারটি isচ্ছিক এবং নুল হতে পারে।

QoS

সারিটির সাথে সংযুক্ত হতে মানসম্পন্ন-পরিষেবা স্তর। এই মানটি অগ্রাধিকারটি নির্ধারণ করে যেখানে সিস্টেমটি কার্য সম্পাদনের জন্য কর্ম নির্ধারণ করে। সম্ভাব্য মানগুলির তালিকার জন্য, DispatchQoS.QoSClass দেখুন।

বৈশিষ্ট্যাবলী

কাতারের সাথে যুক্ত হওয়ার জন্য বৈশিষ্ট্যগুলি। প্রেরণ সারি তৈরি করতে সমবর্তী বৈশিষ্ট্য অন্তর্ভুক্ত করুন যা একই সাথে কার্য সম্পাদন করে। যদি আপনি সেই বৈশিষ্ট্যটি বাদ দেন, প্রেরণ সারি ক্রিয়াকলাপ সম্পাদন করে।

autoreleaseFrequency

যে ফ্রিকোয়েন্সিটি দিয়ে কাতারের সময়সূচী নির্ধারিত ব্লকগুলি দ্বারা তৈরি বস্তুগুলিকে অটোরিলেজ করতে হবে। সম্ভাব্য মানগুলির তালিকার জন্য, DispatchQueue.Autore দয়া করে ফ্রিকোয়েন্সি দেখুন

লক্ষ্য

লক্ষ্য সারি যা ব্লকগুলি কার্যকর করে। আপনি যদি সিস্টেমটি বর্তমান অবজেক্টের জন্য উপযুক্ত এমন একটি সারি সরবরাহ করতে চান তবে DISPATCH_TARGET_QUEUE_DEFAULT উল্লেখ করুন।


-3

এটি এখন সহজভাবে:

let serialQueue = DispatchQueue(label: "my serial queue")

ডিফল্টটি সিরিয়াল হয়, সমবর্তী হওয়ার জন্য, আপনি alচ্ছিক বৈশিষ্ট্য যুক্তি ব্যবহার করেন c


যুক্ত করে আপনি নিজের উত্তরটি আরও ভালভাবে আপডেট করবেন seiralQueue.async {}। @tylemol
ডনসং

-3
DispatchQueue.main.async(execute: {
   // code
})

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

-4

আপনি এই কোডটি সুইফট ৩.০ এ ব্যবহার করে প্রেরণের সারি তৈরি করতে পারেন

DispatchQueue.main.async
 {
   /*Write your code here*/
 }

   /* or */

let delayTime = DispatchTime.now() + Double(Int64(0.5 * Double(NSEC_PER_SEC))) / Double(NSEC_PER_SEC)                   
DispatchQueue.main.asyncAfter(deadline: delayTime)
{
  /*Write your code here*/
}

1
দুঃখিত, এটি একটি প্রেরণের সারি তৈরি করছে না , এটি রান লুপের মাধ্যমে এক টিকের পরে মূল সারিটি অ্যাক্সেস করছে।
বিল্ডসুসাইড হয়েছে
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.