দর্শন নিয়ন্ত্রকদের মধ্যে যোগাযোগের সর্বোত্তম উপায় কী?


165

অবজেক্টিভি-সি, কোকো এবং আইফোনের সাধারণভাবে নতুন হওয়ার কারণে, ভাষা এবং ফ্রেমওয়ার্কগুলি থেকে সর্বাধিক পাওয়ার জন্য আমার প্রবল ইচ্ছা have

আমি যে সংস্থানগুলি ব্যবহার করছি তার মধ্যে একটি হ'ল স্ট্যানফোর্ডের সিএস 193 পি শ্রেণীর নোট যা তারা ওয়েবে রেখে গেছে। এটিতে বক্তৃতা নোট, অ্যাসাইনমেন্ট এবং নমুনা কোড অন্তর্ভুক্ত রয়েছে এবং যেহেতু কোর্সটি অ্যাপল দেব দ্বারা দেওয়া হয়েছিল, আমি অবশ্যই এটিকে "ঘোড়ার মুখ থেকে" বলে মনে করি।

শ্রেণীর ওয়েবসাইট:
http://www.stanford.edu/class/cs193p/cgi-bin/index.php

লেকচার 08 একটি ইউআইএনএভিগেশন কন্ট্রোলার ভিত্তিক অ্যাপ্লিকেশন তৈরির জন্য একটি কার্যভারের সাথে সম্পর্কিত যা একাধিক ইউআইভিউকন্ট্রোলারগুলিকে ইউআইএনএভিগেশন কন্ট্রোলার স্ট্যাকের দিকে ঠেলে দিয়েছে। ইউআইএনএভিগেশন কন্ট্রোলার এইভাবে কাজ করে। এটা যৌক্তিক। তবে স্লাইডে আপনার ইউআইভিউউকন্ট্রোলারদের মধ্যে যোগাযোগের বিষয়ে কিছু কঠোর সতর্কতা রয়েছে।

আমি এই গুরুতর স্লাইডগুলি থেকে উদ্ধৃত করতে যাচ্ছি:
http://cs193p.stanford.edu/downloads/08- নেভিগেশন ট্যাববারকন্ট্রোলার.পিডিএফ

পৃষ্ঠা 16/51:

কীভাবে ডেটা শেয়ার করবেন না

  • গ্লোবাল ভেরিয়েবল বা সিলেটলেট
    • এর মধ্যে আপনার অ্যাপ্লিকেশন প্রতিনিধি অন্তর্ভুক্ত রয়েছে
  • সরাসরি নির্ভরতা আপনার কোডকে কম ব্যবহারযোগ্য করে তোলে
    • এবং ডিবাগ করা ও পরীক্ষা করা আরও কঠিন

ঠিক আছে. আমি যে নিচে আছি। আপনার অ্যাপের প্রতিনিধিতে ভিউকন্ট্রোলারের মধ্যে যোগাযোগ করার জন্য এবং অ্যাপ প্রতিনিধি পদ্ধতিতে ভিউকন্ট্রোলার দৃষ্টান্তগুলি উল্লেখ করার জন্য আপনার সমস্ত পদ্ধতি অন্ধভাবে টস করবেন না। ফর্সা 'nuff।

আরো উপর একটি বিট, আমরা আমাদের বলার কি আমরা এই স্লাইডটি পেতে উচিত না।

পৃষ্ঠা 18/51:

ডেটা প্রবাহের জন্য সেরা অনুশীলন

  • জিনিসটা ঠিক কি আদানপ্রদান করা প্রয়োজন
  • আপনার দর্শন নিয়ামকের জন্য ইনপুট পরামিতিগুলি সংজ্ঞায়িত করুন
  • শ্রেণিবিন্যাস ব্যাক আপ যোগাযোগের জন্য, আলগা সংযোগ ব্যবহার করুন
    • পর্যবেক্ষকদের জন্য জেনেরিক ইন্টারফেস সংজ্ঞায়িত করুন (প্রতিনিধিদের মতো)

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

ঠিক আছে, তাই ... আমি ভয় করি আমার প্রবক্তা-ফু এত শক্তিশালী না। আমি উপরের উদ্ধৃতিটিতে চূড়ান্ত লাইনটি দ্বারা কিছুটা বিভ্রান্তও আছি। আমি এ সম্পর্কে গুগল করার ক্ষেত্রে আমার ন্যায্য অংশটি করে চলেছি এবং আমি খুঁজে পেয়েছি যা একটি নিবন্ধ হিসাবে পর্যবেক্ষণ / বিজ্ঞপ্তি কৌশলগুলির বিভিন্ন পদ্ধতি সম্পর্কে কথা বলে মনে হচ্ছে:
http://cocoawithlove.com/2008/06/five-approaches-to -listening-observing.html

পদ্ধতি # 5 এমনকি প্রতিনিধিদের একটি পদ্ধতি হিসাবে নির্দেশ করে! ব্যতীত .... অবজেক্টগুলি একবারে কেবলমাত্র একটি প্রতিনিধি সেট করতে পারে। সুতরাং যখন আমার একাধিক ভিউ কন্ট্রোলার যোগাযোগ থাকবে তখন আমি কী করব?

ঠিক আছে, সেট আপ গ্যাং। আমি জানি আমি সহজে আমার appdelegate রেফারেন্স এর একাধিক viewcontroller দৃষ্টান্ত মাধ্যেমে অ্যাপ্লিকেশন প্রতিনিধি আমার যোগাযোগ পদ্ধতি কি করতে পারেন কিন্তু আমি আর এই সাজানোর কাজ করতে চান ডান উপায়।

নিম্নলিখিত প্রশ্নের উত্তর দিয়ে আমাকে "সঠিক জিনিস করতে" সহায়তা করুন:

  1. আমি যখন UINavigationController স্ট্যাক-এ একটি নতুন viewcontroller ধাক্কা চেষ্টা করছি, যারা এই ধাক্কা কাজ করা উচিত। আমার কোডের কোন শ্রেণী / ফাইলের সঠিক স্থান?
  2. যখন আমি আমার UIViewControllers এক কিছু ডেটা টুকরা (একটি iVar মান) প্রভাবিত করার যখন আমি একটি আছি চান বিভিন্ন UIViewController, "অধিকার" উপায় এই কাজ করতে কি?
  3. দিন আমরা কেবল একটি বস্তু, জানাব কী যখন প্রভাষক বলেছেন জন্য বাস্তবায়ন চেহারা একটি সময়ে এক প্রতিনিধি সেট আছে করতে পারে "পর্যবেক্ষক জন্য একটি জেনেরিক ইন্টারফেস নির্ধারণ করুন (প্রতিনিধিদল মত)" । একটি সিউডোকোড উদাহরণ সম্ভব হলে এখানে ভয়ঙ্করভাবে সহায়ক হবে।

এর কয়েকটি প্রবন্ধটি অ্যাপল-এর ​​এই নিবন্ধে সম্বোধন করা হয়েছে - বিকাশকারী
জেমস মুর

শুধু একটি দ্রুত মন্তব্য: স্ট্যানফোর্ড CS193P বর্গ জন্য ভিডিওগুলি এখন আইটিউনস ইউ দ্য সর্বশেষ (2012-13) মাধ্যমে উপলব্ধ দেখা যেতে পারে itunes.apple.com/us/course/coding-together-developing/... এবং আমি আশা ভবিষ্যতের ভিডিও এবং স্লাইডগুলি cs193p.stanford.edu
টমাস ওয়াটসন

উত্তর:


224

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

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

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

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

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

এটাই আমার প্রতিক্রিয়ার মূল বক্তব্য। আমি যদি সহায়ক হয় তবে নীচে একটি নিয়ামকের সাথে নির্ভরতা ইনজেকশন প্যাটার্নটি ব্যবহার করার একটি উদাহরণ অন্তর্ভুক্ত করব।

ভিউ কন্ট্রোলারের সাথে নির্ভরতা ইনজেকশন ব্যবহারের উদাহরণ

ধরা যাক আপনি একটি স্ক্রিন তৈরি করছেন যেখানে বেশ কয়েকটি বই তালিকাভুক্ত রয়েছে। ব্যবহারকারী যে বইগুলি কিনতে চান সেগুলি চয়ন করতে পারে এবং তারপরে চেকআউট স্ক্রীনে যেতে একটি "চেকআউট" বোতামটি আলতো চাপতে পারে।

এটি তৈরির জন্য, আপনি একটি বুকপিকচারভিউ কনট্রোলার ক্লাস তৈরি করতে পারেন যা জিইউআই / ভিউ অবজেক্টগুলিকে নিয়ন্ত্রণ করে এবং প্রদর্শন করে। এটি বইয়ের সমস্ত ডেটা কোথায় পাবে? ধরা যাক এটি এর জন্য কোনও বুকওয়েজহাউজ অবজেক্টের উপর নির্ভর করে। সুতরাং এখন আপনার নিয়ামকটি মূলত কোনও মডেল অবজেক্ট (বুকওয়্যারহাউস) এবং জিইউআই / ভিউ অবজেক্টের মধ্যে ডেটা ব্রোকারিং করে is অন্য কথায়, BookPickerViewController BookWarehouse অবজেক্টে ডিপেন্ড করে P

এটি করবেন না:

@implementation BookPickerViewController

-(void) doSomething {
   // I need to do something with the BookWarehouse so I'm going to look it up
   // using the BookWarehouse class method (comparable to a global variable)
   BookWarehouse *warehouse = [BookWarehouse getSingleton];
   ...
}

পরিবর্তে, নির্ভরতাগুলি এভাবে ইনজেকশন করা উচিত:

@implementation BookPickerViewController

-(void) initWithWarehouse: (BookWarehouse*)warehouse {
   // myBookWarehouse is an instance variable
   myBookWarehouse = warehouse;
   [myBookWarehouse retain];
}

-(void) doSomething {
   // I need to do something with the BookWarehouse object which was 
   // injected for me
   [myBookWarehouse listBooks];
   ...
}

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

@implementation BookPickerViewController

-(void) initWithWarehouse:    (BookWarehouse*)warehouse 
        andCheckoutController:(CheckoutController*)checkoutController 
{
   myBookWarehouse = warehouse;
   myCheckoutController = checkoutController;
}

-(void) handleCheckout {
   // We've collected the user's book picks in a "bookPicks" variable
   [myCheckoutController handleCheckout: bookPicks];
   ...
}

এই সমস্ত কিছুর নেট ফলাফল হ'ল আপনি আমাকে আপনার বুকপিকারভিউ কনট্রোলার ক্লাস দিতে পারেন (এবং সম্পর্কিত জিইআইআই / দেখার বিষয়গুলি) এবং আমি সহজেই এটি নিজের প্রয়োগে ব্যবহার করতে পারি, বুকওয়্যারহাউস এবং চেকআউটকন্ট্রোলার জেনেরিক ইন্টারফেস (যেমন, প্রোটোকল) ধরে নিচ্ছি যা আমি প্রয়োগ করতে পারি :

@interface MyBookWarehouse : NSObject <BookWarehouse> { ... } @end
@implementation MyBookWarehouse { ... } @end

@interface MyCheckoutController : NSObject <CheckoutController> { ... } @end
@implementation MyCheckoutController { ... } @end

...

-(void) applicationDidFinishLoading {
   MyBookWarehouse *myWarehouse = [[MyBookWarehouse alloc]init];
   MyCheckoutController *myCheckout = [[MyCheckoutController alloc]init];

   BookPickerViewController *bookPicker = [[BookPickerViewController alloc] 
                                         initWithWarehouse:myWarehouse 
                                         andCheckoutController:myCheckout];
   ...
   [window addSubview:[bookPicker view]];
   [window makeKeyAndVisible];
}

শেষ অবধি, কেবলমাত্র আপনার বুকপিকারকন্ট্রোলার পুনরায় ব্যবহারযোগ্য নয় তবে এটি পরীক্ষা করা আরও সহজ।

-(void) testBookPickerController {
   MockBookWarehouse *myWarehouse = [[MockBookWarehouse alloc]init];
   MockCheckoutController *myCheckout = [[MockCheckoutController alloc]init];

   BookPickerViewController *bookPicker = [[BookPickerViewController alloc] initWithWarehouse:myWarehouse andCheckoutController:myCheckout];
   ...
   [bookPicker handleCheckout];

   // Do stuff to verify that BookPickerViewController correctly called
   // MockCheckoutController's handleCheckout: method and passed it a valid
   // list of books
   ...
}

19
যখন আমি এই জাতীয় প্রশ্নগুলি (এবং উত্তর) দেখতে পাই, যখন এইরকম যত্ন সহকারে তৈরি করা হয়, তখন আমি হাসি ছাড়া সাহায্য করতে পারি না। আমাদের নির্দোষ প্রশ্নকর্তাকে এবং আপনার কাছে ভাল প্রাপ্য কুডোস !! এদিকে, আমি আপনার দ্বিতীয় পয়েন্টে উল্লেখ করা সেই সহজ হস্তক্ষেপকৃত আক্রমণাত্মক কোড ডটকের জন্য একটি আপডেট লিঙ্কটি ভাগ করে নিতে চেয়েছিলাম: আক্রমণাত্মক কোড / ২০০৯ / ०৯ /… - আপনার অন্তর্দৃষ্টি এবং সেরা অনুশীলনগুলি ভাগ করে নেওয়ার জন্য, আবার উদাহরণ সহ এটি ব্যাক আপ করার জন্য ধন্যবাদ!
জো

আমি রাজী. প্রশ্নটি ভালভাবে তৈরি হয়েছিল, এবং উত্তরটি ছিল দুর্দান্ত। কেবল কোনও প্রযুক্তিগত উত্তর না দিয়ে এটি ডিআই ব্যবহার করে কীভাবে / কেন প্রয়োগ করা হয়েছে তার পিছনে কিছু মনোবিজ্ঞানেরও অন্তর্ভুক্ত রয়েছে। ধন্যবাদ! +1 আপ।
কেভিন এলিয়ট

আপনি যদি ইচ্ছার তালিকার জন্য কোনও বই বাছাইয়ের জন্য বুকপিকারকন্ট্রোলার ব্যবহার করতে চান বা একাধিক সম্ভাব্য বুকপিকিং কারণেও ব্যবহার করতে চান। আপনি কি চেকআউটকন্ট্রোলার ইন্টারফেস পদ্ধতির ব্যবহার করতে পারেন (সম্ভবত বুকস্লেশনকন্ট্রোলারের মতো কোনও নামকরণ করা হয়েছে) বা সম্ভবত এনএসনিটিফিকেশন সেন্টার ব্যবহার করবেন?
লেস

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

1
পয়েন্ট ২-এ উল্লিখিত লিঙ্কটি আবারো পরিবর্তিত হয়েছে বলে মনে হচ্ছে - এখানে ওয়ার্কিং লিঙ্কটি ইনভ্যাসিভ কোড
ব্লগ

15

এই ধরণের জিনিসটি সর্বদা স্বাদের বিষয়।

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

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

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

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

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

@class Editor;
@protocol EditorDelegate
// called when you're finished.  updated = YES for 'save' button, NO for 'cancel'
- (void)editor:(Editor*)editor finishedEditingModel:(id)model updated:(BOOL)updated;  
@end

// this is an abstract class
@interface Editor : UIViewController {
    id model;
    id <EditorDelegate> delegate;
}
@property (retain) Model * model;
@property (assign) id <EditorDelegate> delegate;

...define methods here...
@end

@interface AmountEditor : Editor
...define interface here...
@end

@interface TextEditor : Editor
...define interface here...
@end

// TransactionController shows the transaction's details in a table view
@interface TransactionController : UITableViewController <EditorDelegate> {
    AmountEditor * amountEditor;
    TextEditor * textEditor;
    Transaction * transaction;
}
...properties and methods here...
@end

এবং এখন লেনদেন নিয়ন্ত্রণকারী থেকে কয়েকটি পদ্ধতি:

- (void)viewDidLoad {
    amountEditor.delegate = self;
    textEditor.delegate = self;
}

- (void)editAmount {
    amountEditor.model = self.transaction;
    [self.navigationController pushViewController:amountEditor animated:YES];
}

- (void)editNote {
    textEditor.model = self.transaction;
    [self.navigationController pushViewController:textEditor animated:YES];
}

- (void)editor:(Editor*)editor finishedEditingModel:(id)model updated:(BOOL)updated {
    if(updated) {
        [self.tableView reloadData];
    }

    [self.navigationController popViewControllerAnimated:YES];
}

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


1
এটি কি ঠিক তেমন কাজ করার কথা? Editor.delegateমেম্বার নিয়ে আমার সমস্যা হচ্ছে । আমার সালে viewDidLoadপদ্ধতি, আমি পেয়ে করছি Property 'delegate' not found...। আমি ঠিক নিশ্চিত নই যে আমি অন্য কিছু ভুল করেছি কিনা। বা যদি এটি সংক্ষিপ্ততার জন্য সংক্ষিপ্ত করা হয়।
জেফ

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

Gotcha। আমি যা জানতে চেয়েছিলাম ঠিক তা-ই। আমি এটি কিছু সংশোধন করে কাজ করেছিলাম, তবে আমি কিছুটা উদ্বিগ্ন ছিলাম যে এটি ভার্চামের সাথে মেলে না।
জেফ

0

আমি আপনার সমস্যা দেখতে পাচ্ছি ..

যা ঘটেছে তা হ'ল কেউ এমভিসি আর্কিটেকচার সম্পর্কে ধারণা বিভ্রান্ত করেছেন।

এমভিসির তিনটি অংশ রয়েছে .. মডেল, ভিউ এবং কন্ট্রোলার .. বর্ণিত সমস্যাটি মনে হয় যে এগুলি দুটি ভাল কারণ ছাড়াই একত্রিত হয়েছে। মতামত এবং নিয়ন্ত্রণকারীরা যুক্তিযুক্ত অংশ পৃথক।

সুতরাং ... আপনি একাধিক ভিউ-কন্ট্রোলার রাখতে চান না ..

আপনি একাধিক মতামত এবং একটি নিয়ামক রাখতে চান যা তাদের মধ্যে চয়ন করে। (আপনার যদি একাধিক অ্যাপ্লিকেশন থাকে তবে আপনার একাধিক কন্ট্রোলারও থাকতে পারে)

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

সুতরাং .. আপনার দৃষ্টিভঙ্গি ঠিক এটি করে তা নিশ্চিত করুন, ডেটার একটি সুন্দর ভিজ্যু রাখে। আপনার নিয়ামককে ডেটা দিয়ে কী করা উচিত এবং কোন দর্শনটি ব্যবহার করা উচিত তা সিদ্ধান্ত নিতে দিন।

(এবং যখন আমরা ডেটা নিয়ে কথা বলি, আমরা মডেল সম্পর্কে কথা বলি ... স্টোর করা, অ্যাক্সেস করা, সংশোধিত হওয়ার একটি দুর্দান্ত স্ট্যান্ডার্ড পদ্ধতি ... যুক্তির আরও একটি পৃথক অংশ যা আমরা পার্সেল করে ভুলে যেতে পারি)


0

ধরুন এ এবং বি দুটি শ্রেণি রয়েছে।

ক্লাস এ এর ​​উদাহরণ

একটি আইন;

ক্লাস এ, বি শ্রেণীর উদাহরণ তৈরি করে

বি অবসর;

এবং আপনার ক্লাস বি এর যুক্তি অনুসারে কোথাও আপনাকে ক্লাস এ এর ​​একটি পদ্ধতিতে যোগাযোগ বা ট্রিগার করতে হবে

1) ভুল উপায়

আপনি আইসনট্যান্সটি বাইস্যান্টাসে পাস করতে পারেন। এখন বিন্যাসে কাঙ্ক্ষিত অবস্থান থেকে পছন্দসই পদ্ধতির কল [আইসনস্ট্যান্স পদ্ধতি নাম] রাখুন।

এটি আপনার উদ্দেশ্যটি সম্পাদন করতে পারে তবে মুক্তির সময় কোনও স্মৃতি লক হয়ে যায় এবং মুক্ত হয় না।

কিভাবে?

আপনি যখন আইন্সট্যান্সটিকে দ্বিপদ থেকে উত্তীর্ণ করেছিলেন, তখন আমরা আইসনস্ট্যান্সের রক্ষণাবেক্ষণকে 1 দিয়ে বাড়িয়েছিলাম যখন দ্বি-স্থান নির্ধারণ করে, আমাদের স্মৃতিশক্তি আটকে থাকবে কারণ দ্বিবিধানের কারণে আইন্সট্যান্সটি কখনই 0 রক্ষণাবেক্ষণে আনা যায় না কারণ বিসস্ট্যান্স নিজেই আইসনস্ট্যান্সের অবজেক্ট is

এরপরে, আইন্সট্যান্স আটকে থাকার কারণে, বিআইন্সট্যান্সের স্মৃতিও আটকে থাকবে (ফাঁস)। সুতরাং পরবর্তী সময়ে যখন সময় আসে তখন নিজেই আইসনট্যান্সকে অবলম্বন করার পরেও এর স্মৃতিশক্তিটি ব্লক হয়ে যাবে কারণ বিস্ট্যান্ট ক্যান্টকে মুক্তি দেওয়া যায় এবং বিআইন্সট্যান্স আইন্সট্যান্সের একটি শ্রেণি পরিবর্তনশীল।

2) সঠিক উপায়

আইন্সট্যান্সকে দ্বি-প্রতিষ্ঠানের প্রতিনিধি হিসাবে সংজ্ঞায়িত করার মাধ্যমে, আইনেস্ট্যান্সের কোনও রক্ষণক্ষেত্র পরিবর্তন বা স্মৃতি জড়িত থাকবে না।

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

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