কীভাবে কোরডেটা এবং একটি আরআরএসটি ওয়েব পরিষেবা সিঙ্ক করবেন একত্রে এবং একই সময়ে সঠিকভাবে ইউআই তে কোনও REST ত্রুটি প্রচার করুন


85

আরে, আমি এখানে আমাদের অ্যাপের জন্য মডেল স্তরের উপর কাজ করছি।

প্রয়োজনীয়তাগুলির কয়েকটি হ'ল:

  1. এটি আইফোন ওএস 3.0+ এ কাজ করা উচিত।
  2. আমাদের ডেটার উত্সটি একটি রেস্টলফুল রেল অ্যাপ্লিকেশন।
  3. কোর ডেটা ব্যবহার করে আমাদের স্থানীয়ভাবে ডেটা ক্যাশে করা উচিত।
  4. ক্লায়েন্ট কোড (আমাদের ইউআই কন্ট্রোলারদের) যেকোন নেটওয়ার্ক স্টাফ সম্পর্কে যথাসম্ভব কম জ্ঞান থাকা উচিত এবং কোর ডেটা এপিআই দিয়ে মডেলটিকে কোয়েরি / আপডেট করা উচিত।

আমি সার্ভার-চালিত ব্যবহারকারী অভিজ্ঞতা তৈরির বিষয়ে ডাব্লুডাব্লুডিসি 10 সেশন 117 পরীক্ষা করে দেখেছি , উদ্দেশ্য উত্স , কোর রিসোর্স এবং রেস্টফুলকোরডাটা ফ্রেমওয়ার্কগুলি পরীক্ষা করে কিছু সময় ব্যয় করেছি ।

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

এখন পর্যন্ত সমস্ত কিছু ঠিক আছে এবং প্রাথমিকভাবে আমি যদিও কোর রিসোর্স বা রেস্টফুলকোরডাটা উপরের সমস্ত প্রয়োজনীয়তা কভার করব তবে ... এখানে দুটি জিনিস রয়েছে যাগুলির মধ্যে কোনওটিই সঠিকভাবে সমাধান করার জন্য ঘটেনি বলে মনে হচ্ছে:

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

কোর রিসোর্স যখন আপনি কল করবেন তখন সার্ভারে এর সমস্ত অনুরোধ জারি করার জন্য ঘটে - (BOOL)save:(NSError **)error আপনার পরিচালিত অবজেক্ট কনটেক্সটটিতে করেন তখন কোর্স এবং তাই সার্ভারের অন্তর্নিহিত অনুরোধগুলির একটি সঠিক এনএসিররর উদাহরণ সরবরাহ করতে সক্ষম হয় যাতে কোনওভাবে ব্যর্থ হয়। তবে সেভ অপারেশন শেষ না হওয়া অবধি কলিং থ্রেডটিকে অবরুদ্ধ করে। ব্যর্থ

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

সুতরাং, আমি এই সমস্ত সমস্যার সাথে মোকাবিলা করার একটি সম্ভাব্য সমাধান / সাধারণ অনুশীলনগুলির সন্ধান করছি:

  1. আমি চাই না যে প্রতিটিটিতে কলিং থ্রেডটি ব্লক হয়ে যায় -save:নেটওয়ার্কের অনুরোধগুলি হওয়ার সময় আমি কলটিতে ।
  2. আমি কোনওভাবে ইউআই-তে বিজ্ঞপ্তি পেতে চাই যে কিছু সিঙ্ক ক্রিয়াকলাপটি ভুল হয়েছে।
  3. আমি চাই সার্ভারের অনুরোধ ব্যর্থ হলে প্রকৃত কোর ডেটা সংরক্ষণও ব্যর্থ।

কোন ধারনা?


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

দুর্দান্ত প্রশ্ন, আপনাকে ধন্যবাদ।
জাস্টিন

কোর রিসোর্সের লিঙ্কটি নষ্ট হয়ে গেছে, এখন কোথায় এটি হোস্ট করা হয়েছে কেউ জানেন?


এবং মূল সাইটটি গিটহাবের পাশাপাশি পাওয়া যাবে: github.com/mikelaurence/coreresource.org
এপলোকো

উত্তর:


26

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


18

তিনটি মৌলিক উপাদান রয়েছে:

  1. ইউআই অ্যাকশন এবং কোরেডাটাতে পরিবর্তন অবিরত
  2. সার্ভারে যে পরিবর্তন আপ থাকা
  3. সার্ভারের প্রতিক্রিয়া দিয়ে ইউআইকে রিফ্রেশ করছে

একটি NSOperation + NSOperationQueue নেটওয়ার্ক অনুরোধগুলি সুশৃঙ্খল রাখতে সহায়তা করবে। একটি প্রতিনিধি প্রোটোকল আপনার ইউআই ক্লাসগুলিকে নেটওয়ার্ক অনুরোধগুলি কী অবস্থায় রয়েছে তা বুঝতে সহায়তা করবে, এরকম কিছু:

@protocol NetworkOperationDelegate
  - (void)operation:(NSOperation *)op willSendRequest:(NSURLRequest *)request forChangedEntityWithId:(NSManagedObjectID *)entity;
  - (void)operation:(NSOperation *)op didSuccessfullySendRequest:(NSURLRequest *)request forChangedEntityWithId:(NSManagedObjectID *)entity;
  - (void)operation:(NSOperation *)op encounteredAnError:(NSError *)error afterSendingRequest:(NSURLRequest *)request forChangedEntityWithId:(NSManagedObjectID *)entity;
@end

প্রোটোকল ফর্ম্যাট অবশ্যই আপনার নির্দিষ্ট ব্যবহারের ক্ষেত্রে নির্ভর করবে তবে মূলত আপনি যা তৈরি করছেন তা এমন একটি প্রক্রিয়া যার মাধ্যমে আপনার সার্ভারে পরিবর্তনগুলি "ধাক্কা" দেওয়া যেতে পারে।

এরপরে ইউআই লুপটি বিবেচনার জন্য রয়েছে, আপনার কোডটি পরিষ্কার রাখার জন্য সেভ কল করা ভাল হবে: এবং স্বয়ংক্রিয়ভাবে পরিবর্তনগুলি সার্ভারের দিকে ঠেলে দেওয়া হবে। আপনি এর জন্য NSManagedObjectContextDidSave বিজ্ঞপ্তি ব্যবহার করতে পারেন।

- (void)managedObjectContextDidSave:(NSNotification *)saveNotification {
  NSArray *inserted = [[saveNotification userInfo] valueForKey:NSInsertedObjects];
  for (NSManagedObject *obj in inserted) {
    //create a new NSOperation for this entity which will invoke the appropraite rest api
    //add to operation queue
  }

  //do the same thing for deleted and updated objects
}

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

যদি আপনার আরএসটি এপিআই ব্যাচিংকে সমর্থন করে, আপনি এমনকি একবারে পুরো অ্যারেটি পাঠাতে পারেন এবং তারপরে আপনি ইউআইকে অবহিত করতে পারবেন যে একাধিক সত্তা সিঙ্ক্রোনাইজ হয়েছিল।

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


2

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

মূল ডেটা: দক্ষতার সাথে ডেটা আমদানি করা

মূল তথ্য: পরিবর্তন পরিচালনা

কোর ডেটা: কোর ডেটা সহ মাল্টি-থ্রেডিং


0

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

ক্লায়েন্টের সাথে সম্পর্কিত সম্পর্কিত সঞ্চয় করার জন্য আপনাকে কেবলমাত্র সেই তথ্যটি রাখতে হবে এবং সার্ভার থেকে ঠিক না হওয়া পর্যন্ত এটি সংরক্ষণ করা উচিত নয় যে আপনার কাছে কোনও রিনব্যাক বিকল্প রয়েছে তা নিশ্চিত করে নিন - মুছে ফেলার উপায়টি বলুন যে সার্ভার ব্যর্থ হয়েছে।

সাবধান থাকুন যে আপনি 2-পর্যায়ের কমিট প্রক্রিয়াটি না করা ছাড়া এটি কখনই 100% নিরাপদ হতে পারে না (ক্লায়েন্ট সংরক্ষণ বা মুছুন সার্ভার সার্ভার থেকে সিগন্যালের পরে ব্যর্থ হতে পারে) তবে সার্ভারের জন্য আপনাকে খুব কমপক্ষে 2 টি ট্রিপ ব্যয় করতে হবে ( আপনার একক রোলব্যাক বিকল্পটি মুছে ফেলা হলে আপনার জন্য ব্যয় করতে পারে 4

আদর্শভাবে, আপনি অপারেশনের পুরো ব্লকিং সংস্করণটি আলাদা থ্রেডে করতে চান তবে তার জন্য আপনার 4.0 প্রয়োজন।

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