এনএসডিফল্টরুনলুপমোড বনাম এনএসআরনলুপকমোনমডস


114

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

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

NSDefaultRunLoopMode

এনএসকানেকশন অবজেক্টগুলি ছাড়া অন্য ইনপুট উত্সগুলির সাথে কাজ করার মোড। এটি সবচেয়ে বেশি ব্যবহৃত রান-লুপ মোড।

NSRunLoopCommonModes

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

CFRunLoopAddCommonMode

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

কেউ দয়া করে উভয়কে মানব ভাষায় ব্যাখ্যা করতে পারেন?

উত্তর:


204

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

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

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

যদি আপনি নিজের NSURLConnectionথ্রেডের জন্য রান লুপ মোডটি পরিবর্তন করে সিদ্ধান্ত নিয়ে ব্যবহার করেন scheduleInRunLoop:forModes:, তবে আপনি নির্দিষ্ট ডিফল্ট রান লুপের পরিবর্তে থ্রেডটিকে একটি বিশেষ রান লুপ মোডে বরাদ্দ করতে পারেন । নামক বিশেষ সিউডো-মোড NSRunLoopCommonModesইভেন্ট ট্র্যাকিং সহ অনেক ইনপুট উত্স দ্বারা ব্যবহৃত হয়। NSURLConnectionউদাহরণস্বরূপ সাধারণ মোডে উদাহরণস্বরূপ অর্পণ করার অর্থ এর ইভেন্টগুলিকে "ট্র্যাকিং মোড" এর সাথে "ডিফল্ট মোড" যুক্ত করে। থ্রেডগুলির সাথে যুক্ত হওয়ার একটি সুবিধা / অসুবিধাNSRunLoopCommonModes হ'ল থ্রেডটি স্পর্শ ইভেন্টের মাধ্যমে ব্লক করা হবে না।

সাধারণ মোডে নতুন মোড যুক্ত করা যেতে পারে তবে এটি বেশ নিম্ন স্তরের অপারেশন।

আমি কয়েকটি নোট যুক্ত করে বন্ধ করতে চাই:

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

  • আপনি জিসিডি ব্যবহারের বিষয়ে বিবেচনা করতে পারেন যা রান লুপ পরিচালনার সমস্যাগুলি থেকে আপনার কোড "রক্ষা" করতে সহায়তা করবে। উপরের উদাহরণে, আপনি নিজের নেটওয়ার্ক অনুরোধগুলিকে একটি কাস্টম সিরিয়াল কাতারে যুক্ত করার কথা বিবেচনা করতে পারেন।


9
প্রিয় ভিগিও 24, এই পরিষ্কার, সুনির্দিষ্ট ব্যাখ্যার জন্য আপনাকে অনেক ধন্যবাদ। আমি অ্যাপলকে তাদের এপিআই গাইডে আপনার মন্তব্য অন্তর্ভুক্ত করতে বলব। ;)
স্টকিম 1

7
viggio24 এর উত্তর নিখুঁত। যারা আগ্রহী তাদের জন্য, আমি উল্লেখ করব যে ডাব্লুডাব্লুডিসি 2010 থেকে সেশন 208 (আইফোন ওএসের জন্য নেটওয়ার্ক অ্যাপস, পার্ট 2) রান লুপগুলিতে একটি ভূমিকা রয়েছে। আপনি যদি আগ্রহী হন তবে একবার দেখুন। আশা করি এটা সাহায্য করবে.
লরেঞ্জো বি

19
আমার জন্য কেবল একটি নোট: NSRunLoopCommonModesস্ক্রোল করার সময় টাইমার ইভেন্টের অনুমতি দেয় UIScrollViewNSDefaultRunLoopModeস্ক্রোল করার সময় টাইমার প্রতিরোধ করুন।
ইওনিল

2
স্ক্রোল ভিউ আপডেট সম্পর্কে মন্তব্যটি আমি খুব আকর্ষণীয় পেয়েছি কারণ এটি একটি চ্যালেঞ্জিং বিষয়ের উল্লেখ করেছে। কেবল এ সম্পর্কে আরও বিশদ যুক্ত করতে: আপনি যখন কোনও এনএসআরএল সংযোগের জন্য কোনও মোড সেট করেন, এটি কেবলমাত্র ডেলিগেট কল কল-ব্যাকের কার্যকরকরণকে প্রভাবিত করে। আমি বুঝতে পারি যে এখানে স্ক্রোলভিউ আপডেট করার ফলে একটি পারফরম্যান্স সমস্যা হতে পারে তবে কেন এটি হচ্ছে? যদি উত্তরটি হয় যে ছবিটি মেমোরিতে লোড করতে হয়, আপনি ব্যাকগ্রাউন্ডে একটি গ্রাফিক প্রসঙ্গে লেখার মাধ্যমে এটি করতে পারেন এবং এটি করার পরে আপনার দৃশ্যের মূল থ্রেড স্তরটি আপডেট করুন। এই শব্দ কি যুক্তিসঙ্গত?
নিবিলো
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.