DispatchQueue.main.async এবং DispatchQueue.main.sync এর মধ্যে পার্থক্য


109

আমি DispatchQueue.main.asyncদীর্ঘসময় ধরে ইউআই সম্পর্কিত ক্রিয়াকলাপ ব্যবহার করে যাচ্ছি ।



সুইফট উভয় সরবরাহ করে DispatchQueue.main.asyncএবং DispatchQueue.main.syncউভয়ই মূল কাতারে সঞ্চালিত হয়।



কেউ আমাকে তাদের মধ্যে পার্থক্য বলতে পারেন? আমার কখন ব্যবহার করা উচিত?



DispatchQueue.main.async {
    self.imageView.image = imageView
    self.lbltitle.text = ""

}

DispatchQueue.main.sync {
    self.imageView.image = imageView
    self.lbltitle.text = ""
}

উত্তর:


56

আপনি যখন asyncএটি ব্যবহার করবেন তখন প্রেরিত ব্লকটি কার্যকর না হওয়া পর্যন্ত অপেক্ষা না করে কলিং সারিটি চলতে দেয়। বিপরীতে syncকলিং সারিটি থামিয়ে দেবে এবং আপনি ব্লকে প্রেরণ করেছেন এমন কাজ শেষ না হওয়া পর্যন্ত অপেক্ষা করুন। অতএব syncডেডলকস নেতৃত্ব সাপেক্ষে। DispatchQueue.main.syncমূল সারি থেকে চালানোর চেষ্টা করুন এবং অ্যাপ্লিকেশন হিমশীতল হবে কারণ প্রেরিত ব্লকটি শেষ না হওয়া পর্যন্ত কলিংয়ের সারিটি অপেক্ষা করবে তবে এটি শুরু করতে সক্ষম হবে না (কারণ সারিটি থামানো হয়েছে এবং অপেক্ষা করা হচ্ছে)

কখন ব্যবহার করবেন sync? যখন আপনার বিবিধ কাতারে কিছু করার জন্য অপেক্ষা করতে হবে এবং কেবল তখনই আপনার বর্তমান কাতারে কাজ চালিয়ে যেতে হবে

সিঙ্ক ব্যবহারের উদাহরণ:

একটি সিরিয়াল কাতারে আপনি syncএকই সময়ে কেবল একটি থ্রেড কোডের সুরক্ষিত টুকরা সম্পাদন করতে সক্ষম হবেন তা নিশ্চিত করার জন্য একটি মুটেক্স হিসাবে ব্যবহার করতে পারেন ।


DispatchQueue.main.syncএকটি পটভূমি থ্রেড থেকে কল করা ভুল হবে ?
মধু

@ মধু সাধারণভাবে না, এ জাতীয় কলটিতে কোনও ভুল নেই (যতক্ষণ না মূল সারি ভারী ও সময়সাপেক্ষ কিছু করে না) তবে বাস্তবে আপনার এমন পরিস্থিতি সম্পর্কে আমি ভাবতে পারি না যেখানে আপনার সত্যই এটি প্রয়োজন। অবশ্যই আরও ভাল সমাধান হওয়া উচিত
অ্যান্ড্রে চেরুনুখ

4
@ হানি এমনই একটি পরিস্থিতি ফটোকিট এপিআই থেকে পিএইচএসেটের একটি ভিউ আপডেট করছে, যা এখানে ডকুমেন্টেশনে দেখানো হয়েছে: বিকাশকারী.অ্যাপল
শিখুন

4
@teacup আকর্ষণীয় আমি কেবল ভাবছি যে আমরা asyncসেখানে ডাকলে কীভাবে এটির অন্যরকম হবে? আমার অর্থ যেহেতু থ্রেডের পরে আর কিছুই নেই তবে এটি কোনও পার্থক্য করে না। যদি তা হয় DispatchQueue.main.sync {block1}; DispatchQueue.main.sync {block2};তবে তা বোধগম্য হত। তবে যখন অন্য কোনও ব্লক নেই তখন আমি DispatchQueue.main.sync {Oneblock}ওভার ব্যবহারের সুবিধা সম্পর্কে ভাবতে পারি না DispatchQueue.main.async {Oneblock}। উভয়ের জন্যই তারা মূল কিউয়ের অগ্রাধিকার / তাত্ক্ষণিকতা পাবেন এবং তাদের কোনও কিছুই বাধা দেবে না।
মধু

4
@ মধু "যেহেতু থ্রেডের পরে আর কিছুই নেই" যখন আপনি মূল থ্রেডে থাকবেন না তখন এটি সত্য হয় না, যা অ্যাপ্লিকেশনটির সাথে সমস্ত ব্যবহারকারীর ইন্টারঅ্যাকশনগুলির জন্য দায়বদ্ধ। সুতরাং, উদাহরণস্বরূপ, কোনও ফটো ফটো লাইব্রেরিডিজ চেঞ্জের আগে কোনও আপডেটেড ডেটাসোর্স দিয়ে মারাত্মক অসঙ্গতি ত্রুটির কারণে ফিরে আসার আগে অন্য কোনও ফটো মুছতে পারে।
31:58

166

সান্নিধ্য কেন?

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

কয়েকটি বিমূর্ততা সম্পর্কে আমাদের সচেতন হওয়া দরকার।

  • সারি
  • সিঙ্ক্রোনাস / এসিনক্রোনাস টাস্ক পারফরম্যান্স।
  • অগ্রাধিকার।
  • সাধারণ ঝামেলা।

সারি

অবশ্যই সিরিয়াল বা সমবর্তী হতে হবে । পাশাপাশি একই সাথে বৈশ্বিক বা বেসরকারী

ক্রমিক সারিগুলির সাথে, কার্যগুলি এক সাথে সমাপ্ত হবে যখন সমবর্তী সারির সাথে, কাজগুলি একই সাথে সঞ্চালিত হবে এবং অপ্রত্যাশিত সময়সূচীতে সমাপ্ত হবে। একই গোষ্ঠীর কাজগুলি সমবর্তী সারির তুলনায় সিরিয়াল কাতারে আরও সময় নেবে।

আপনি নিজের ব্যক্তিগত কাতার তৈরি করতে পারেন ( সিরিয়াল বা সমবর্তী উভয় ) বা ইতিমধ্যে উপলব্ধ গ্লোবাল (সিস্টেম) সারি ব্যবহার করতে পারেন । প্রধান কিউ শুধুমাত্র ক্রমিক কিউ সব আউট বিশ্বব্যাপী সারিগুলি

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

পরিষেবার গুণমান / অগ্রাধিকার

কাতারেও বিভিন্ন কিউস (পরিষেবার মান) রয়েছে যা কার্য সম্পাদনকে অগ্রাধিকার নির্ধারণ করে (সর্বোচ্চ থেকে নীচে এখানে):
.userInteractive - প্রধান সারি
.userInitiated - ব্যবহারকারীর জন্য যে কাজ শুরু করা হয়েছে তার উপর ব্যবহারকারী কিছু প্রতিক্রিয়া
প্রত্যাশার জন্য অপেক্ষা করে u কার্যগুলির জন্য - যা কিছুটা সময় নেয় এবং তাত্ক্ষণিক প্রতিক্রিয়ার প্রয়োজন হয় না, যেমন ডেটা নিয়ে কাজ করা
back ব্যাকগ্রাউন্ড - ভিজ্যুয়াল অংশের সাথে সম্পর্কিত নয় এবং যা সমাপ্তির জন্য কঠোর নয়) এর জন্য।

রয়েছে

.default কিউ যা does't স্থানান্তর QoS তথ্য। যদি কোয়াসটি সনাক্ত করা সম্ভব না হত তবেQos .userInitiated এবং .uutility এর মধ্যে ব্যবহার করা হবে ।

টাস্কগুলি সিঙ্ক্রোনজ বা অ্যাসিঙ্ক্রোনালি সম্পাদন করা যায় ।

  • সিঙ্ক্রোনাস ফাংশনটি কাজ শেষ হওয়ার পরেই বর্তমান কাতারে নিয়ন্ত্রণ ফিরিয়ে দেয়। এটি সারিটি ব্লক করে এবং কাজ শেষ হওয়া পর্যন্ত অপেক্ষা করে।

  • বিভিন্ন কাতারে কার্য সম্পাদনের জন্য পাঠানো হওয়ার পরে অ্যাসিঙ্ক্রোনাস ফাংশনটি বর্তমান কাতারে নিয়ন্ত্রণ ফিরে আসে। টাস্ক শেষ না হওয়া পর্যন্ত এটি অপেক্ষা করে না। এটি সারিটি ব্লক করে না।

সাধারণ ঝামেলা।

সমসাময়িক অ্যাপ্লিকেশনগুলি প্রজেক্ট করার সময় প্রোগ্রামাররা সর্বাধিক জনপ্রিয় ভুলগুলি নিম্নলিখিত:

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

মূল কাতারে সিঙ্ক ফাংশনটি কখনও কল করবেন না
আপনি যদি মূল কাতারে সিঙ্ক ফাংশনটি কল করেন তবে এটি সারিটি ব্লক করার সাথে সাথে সারিটি কাজটি শেষ হওয়ার অপেক্ষায় থাকবে তবে এই কাজটি কখনই শেষ হবে না কারণ এটি সারিটির কারণে এমনকি শুরু করতে সক্ষম হবে না ইতিমধ্যে অবরুদ্ধ একে ডেডলক বলা হয় ।

সিঙ্ক কখন ব্যবহার করবেন? যখন আমাদের কাজটি শেষ না হওয়া পর্যন্ত অপেক্ষা করতে হবে। Fe যখন আমরা নিশ্চিত করছি যে কোনও ফাংশন / পদ্ধতি ডাবল নয়। Fe আমাদের সিঙ্ক্রোনাইজেশন রয়েছে এবং এটি সম্পূর্ণরূপে শেষ না হওয়া পর্যন্ত ডাবল ডাকা হতে আটকাতে চেষ্টা করছে। এই উদ্বেগের জন্য এখানে কিছু কোড রয়েছে:
আইওএস ডিভাইসে ত্রুটি ক্র্যাশ রিপোর্টের কারণ কীভাবে তা খুঁজে বের করবেন?


4
আমার মনে হয় না যে "কখনই মূল কাতারে সিঙ্ক ফাংশনটি কল করুন" ঠিক আছে। এমন কিছু ক্ষেত্রে রয়েছে যখন আপনি মূল থ্রেডে সিঙ্কটি কল করবেন উদাহরণস্বরূপ যখন আপনার কাছে একটি বৈশ্বিক কাউন্টার রয়েছে যখন আপনার প্রতিটি অবজেক্টটি ব্যবহার এবং বাড়ানোর জন্য প্রয়োজন: dispatchQueue.sync {গণনা + = 1; স্ব.অর্ডারআইডি = গণনা}
ইলিশা স্টারনগোল্ড

6
কিউওএস ক্লাস - .userInteractive মূল সারি নয়।
কুণাল শাহ

4
DispatchQueue.main.syncএকটি পটভূমি থ্রেড থেকে কল করা ভুল হবে ?
মধু

4
@ হানি, এটিকে কল করা ভুল নয় তবে আমার অভিজ্ঞতা থেকে আপনি নিজেকে সিঙ্ক ব্যতীত ডিসপ্যাচকিউ.ইমেন.সেনসিচ আরও বেশি কল করতে পারেন।
জেমস কিম

4
আপনি কি বলবেন না যে আপনার বর্তমান সারিটিতে সিঙ্ক () ফাংশনটি কখনও কল করা উচিত নয়? আপনি যদি অন্য কাতারে থাকেন তবে মূল কাতারে সিঙ্ক () কল করা ভুল নয়, যদি আমি সঠিকভাবে বুঝতে পারি।
ইয়েকে

1

GCDআপনাকে কোনও কার্য সম্পাদন করতে synchronouslyবা asynchronously[সম্পর্কে]

synchronous(ব্লক এবং অপেক্ষা করুন) ফাংশনটি যখন কাজটি শেষ হবে তখন একটি নিয়ন্ত্রণ ফিরে আসে

asynchronous(প্রেরণ এবং এগিয়ে যান) ফাংশনটি তাত্ক্ষণিকভাবে একটি নিয়ন্ত্রণ ফিরে আসে, উপযুক্ত সারিটিতে কাজ প্রেরণের জন্য প্রেরণ করে তবে এটি সম্পন্ন হওয়ার অপেক্ষায় থাকে না।

[ডিসপ্যাচকিউ]


0

syncবা asyncযে কাতারে ডাকা হয় তার পদ্ধতিগুলির কোনও প্রভাব নেই।

syncথ্রেড অবরুদ্ধ করবে থেকে যা বলা হয় এবং না করা হয় কিউ উপর যা বলা হয়। এটি সেই সম্পত্তি DispatchQueueযা স্থির করে যে DispatchQueueকার্যটি কার্যকর করার জন্য অপেক্ষা করবে (ক্রমিক সারি) বা বর্তমান টাস্কটি সমাপ্ত হওয়ার আগে পরবর্তী কাজটি পরিচালনা করতে পারে (সমবর্তী সারিতে)।

এমনকি যখন DispatchQueue.main.asyncএকটি অ্যাসিঙ্ক কল হয় তখনও এতে যুক্ত একটি ভারী শুল্ক অপারেশন ইউআই হিম করতে পারে কারণ এর ক্রিয়াকলাপগুলি মূল থ্রেডে ক্রমিকভাবে সম্পাদিত হয়। যদি এই পদ্ধতিটিকে পটভূমির থ্রেড থেকে কল করা হয়, ততক্ষণে ইউআই হিমায়িত হয়ে যাওয়ার পরেও নিয়ন্ত্রণ সেই থ্রেডটিতে ফিরে আসবে। asyncকলটি চালু হওয়ার কারণে এটিDispatchQueue.main

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