ডিসপ্যাচ_অ্যাসেন্স বোঝা


233

এই কোডটি সম্পর্কে আমার প্রশ্ন রয়েছে

dispatch_async(dispatch_get_global_queue( DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    NSData* data = [NSData dataWithContentsOfURL: 
      kLatestKivaLoansURL];
    [self performSelectorOnMainThread:@selector(fetchedData:) 
      withObject:data waitUntilDone:YES];
});

এই কোডের প্রথম প্যারামিটারটি

dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0) 

আমরা কি এই কোডটিকে বৈশ্বিক কাতারে ক্রমিক কার্য সম্পাদন করতে বলছি যার সংজ্ঞা নিজেই এটি একটি প্রদত্ত অগ্রাধিকার স্তরের বৈশ্বিক সমবর্তী সারিতে ফিরে আসে?

dispatch_get_global_queueমূল সারি ব্যবহার করে কী সুবিধা ?

আমি দ্বিধান্বিত. আপনি কি দয়া করে আমাকে এটি আরও ভালভাবে বুঝতে সাহায্য করতে পারেন।


1
আপনার কোডটি আরও ভাল লাইনে কাটা উচিত যাতে এটি আরও বোধগম্য হয়। dispatch_get_global_queueএকটি ভেরিয়েবল ধরণের ভিতরে আপনার নিরাপদ dispatch_queue_t myQueue। এটির আরও পঠনযোগ্য আপনার মাইকিউয়ে আপনার `` dispatch_async`
অ্যালেক্স সিও

উত্তর:


517

আপনি মূল কাতারে ডিফল্ট সারিটি ব্যবহার করার মূল কারণটি পটভূমিতে কাজগুলি চালানো।

উদাহরণস্বরূপ, আমি যদি ইন্টারনেট থেকে কোনও ফাইল ডাউনলোড করি এবং ডাউনলোডের অগ্রগতিতে আমি ব্যবহারকারীকে আপডেট করতে চাই, তবে আমি অগ্রাধিকার ডিফল্ট কাতারে ডাউনলোড চালাব এবং সংযুক্তি হিসাবে মূল কাতারে ইউআই আপডেট করব।

dispatch_async(dispatch_get_global_queue( DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(void){
    //Background Thread
    dispatch_async(dispatch_get_main_queue(), ^(void){
        //Run UI Updates
    });
});

আমি বুঝতে পেরেছি যে ডেভিড আপনার উত্তরের জন্য ধন্যবাদ জানায় তবে এটি করার যুক্তি বোঝার জন্য আমার প্রশ্নটি আরও বেশি ছিল অর্থাত্ এই
কোডটিটি

আমি আপনার পরামর্শ মতো ঠিক করছি কিন্তু কোনওভাবেই, রান ইউআই আপডেটগুলিতে যখন [সেল্ফ.ট্যাবলভিউ রিলোডডাটা] কল করি ঠিক এখনই uiTableViewCell doupdate doesn't এটি প্রায় 4 বা 5 সেকেন্ড সময় নেয় It's এখন বেশ কয়েক দিন ধরে আমাকে পাগল করছে been ।
গ্র্যান্ডস্টেফ

@ গ্র্যান্ডস্টেফ আমি এই পদ্ধতির সাথে খুব বেশি পরিচিত নই। হতে পারে যে পদ্ধতিটি চালাতে মাত্র 5 সেকেন্ড সময় নেয়। প্রেরণ_অ্যাসিঙ্কের সাথে গুরুত্বপূর্ণ বিষয়টি এটি হ'ল মূল থ্রেড না করে পটভূমিতে জিনিসগুলি করার অনুমতি দেয়।
ডেভিড

2
কি 0বোঝায়?
মধু

3
@ হানি 0 টি flagsপ্যারামিটার যা বর্তমানে একেবারেই কিছুই করে না। দস্তাবেজগুলি থেকে:Flags that are reserved for future use. Always specify 0 for this parameter.
ডেভিড

199

সমস্ত ডিআইএসপিএটিএচচিএইচকিউ_কিউইউ_পিআরআইআরটি_ এক্স সারি একযোগে সারি (মানে তারা একবারে একাধিক কাজ সম্পাদন করতে পারে), এবং এই অর্থে ফিফো হয় যে প্রদত্ত সারিতে থাকা কাজগুলি "ফার্স্ট ইন, ফার্স্ট আউট" অর্ডার ব্যবহার করে কার্যকর করা শুরু করবে। এটি মূল সারিটির সাথে তুলনায় (ডিসপ্যাচ_জেট_মাইন_কিউ () থেকে) যা একটি ক্রমিক কাত (কাজগুলি ক্রম শুরু হবে এবং যে ক্রমে তারা প্রাপ্ত হবে ক্রম সম্পাদন শেষ করবে)।

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

নোট করুন যে ফাঁসির আদেশটি প্রতি-সারি ভিত্তিতে ফিফো। সুতরাং আপনি যদি চারটি বিভিন্ন সমবর্তী কাতারে 1000 প্রেরণ_কেন্দ্র () টাস্কগুলি সমানভাবে বিভক্ত করে এবং ব্যাকগ্রাউন্ড, নিম্ন, খেলোয়াড় এবং উচ্চে ক্রমে প্রেরণ করেন (উদাহরণস্বরূপ আপনি শেষ 250 টি কার্য উচ্চতর সারিতে নির্ধারিত করেছেন) তবে খুব সম্ভবত এটিই সম্ভব আপনি যে প্রথম কাজটি শুরু করতে দেখছেন সেটি সেই উচ্চ কাতারে থাকবে কারণ সিস্টেমটি আপনার এই ধারণাটি গ্রহণ করেছে যে সেই কাজগুলিকে যত তাড়াতাড়ি সম্ভব সিপিইউতে পৌঁছানো দরকার।

এটিও নোট করুন যে আমি বলেছি "ক্রম কার্যকর করা শুরু করবে", তবে মনে রাখবেন যে সমবর্তী সারির হিসাবে জিনিসগুলি প্রতিটি কাজের জন্য সময়ের দৈর্ঘ্যের উপর নির্ভর করে ক্রিয়াকলাপ শেষ করতে হবে না।

অ্যাপল অনুসারে:

https://developer.apple.com/library/content/documentation/General/Conceptual/ConcurrencyProgrammingGuide/OperationQueues/OperationQueues.html

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

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

কনক্যুরেন্সির স্তরটি পুরোপুরি সিস্টেম দ্বারা পরিচালিত হয় এবং এটি সিস্টেম লোড এবং অন্যান্য অভ্যন্তরীণভাবে নির্ধারিত ফ্যাক্টরগুলির উপর ভিত্তি করে। এটি গ্র্যান্ড সেন্ট্রাল ডিসপ্যাচের সৌন্দর্য (প্রেরণ_কেন্দ্রিক (সিস্টেম)) - আপনি কেবল কোড ব্লক হিসাবে আপনার কাজের ইউনিট তৈরি করেন, তাদের জন্য একটি অগ্রাধিকার সেট করুন (আপনি যে সারি পছন্দ করেছেন তার উপর ভিত্তি করে) এবং সিস্টেমটিকে বাকী অংশগুলি পরিচালনা করতে দিন।

সুতরাং আপনার উপরের প্রশ্নের উত্তর দিতে: আপনি আংশিকভাবে সঠিক। আপনি "সেই কোডটি" নির্দিষ্ট অগ্রাধিকার স্তরে বৈশ্বিক সমবর্তী সারিতে সমবর্তী কাজগুলি করতে "জিজ্ঞাসা করছেন"। ব্লকের কোডটি পটভূমিতে কার্যকর করা হবে এবং উপলভ্য সংস্থানসমূহের সিস্টেমের মূল্যায়নের উপর নির্ভর করে সমান্তরালভাবে কোনও অতিরিক্ত (অনুরূপ) কোড কার্যকর করা হবে।

অন্যদিকে "প্রধান" সারিটি (প্রেরণ_সেট_মাইন_কিউ () থেকে) একটি ক্রমিক সারি (সমবর্তী নয়)। মূল কাতারে প্রেরিত টাস্কগুলি সর্বদা ক্রমে কার্যকর হবে এবং সর্বদা ক্রমে শেষ হবে finish এই কাজগুলি ইউআই থ্রেডেও কার্যকর করা হবে সুতরাং এটি আপনার ইউআই আপডেট করার জন্য প্রগতি বার্তা, সমাপ্তির বিজ্ঞপ্তি ইত্যাদির সাথে উপযুক্ত suitable


+1, তবে আমি অনুশীলনে মনে করি সমবর্তী সারিবদ্ধগুলি FIFO হয় বা কেবল এলোমেলো ক্রম কিনা তা খুব বেশি কিছু যায় আসে না। যদি আপনি একটি লুপে 5 টি কাজ শুরু করেন তবে ধরে নিন যে সেগুলি মূলত একই সময়ে শুরু হবে। এর কোনও গ্যারান্টি নেই যে উদাহরণস্বরূপ 1 ম টাস্কের প্রথম I / O অপারেশনটি 5 তম পূর্বে ঘটবে, এমনকি যদি তারা একই কোডটি কার্যকর করে তবে। ওটিওএইচ, সিরিয়াল সারিগুলির জন্য, ফিফোর আচরণটি প্রয়োজনীয় এবং আইএমএইচও এটি দুটি সারি প্রকারের মধ্যে নির্ধারিত পার্থক্য।
জেরহার্ড ওয়েসপ

অবিশ্বাস্য ব্যাখ্যা। অনেক তালি!
ওখন ওকবা

36

সুইফ্ট সংস্করণ

এটি ডেভিডের উদ্দেশ্য-সি উত্তরের সুইফট সংস্করণ। আপনি পটভূমিতে জিনিসগুলি চালনার জন্য বিশ্বব্যাপী সারি এবং ইউআই আপডেট করার জন্য প্রধান সারি ব্যবহার করেন।

DispatchQueue.global(qos: .background).async {
    
    // Background Thread
    
    DispatchQueue.main.async {
        // Run UI Updates
    }
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.