কীভাবে ওয়েব সার্ভারের সাথে আইফোন কোর ডেটা সিঙ্ক করবেন এবং তারপরে অন্যান্য ডিভাইসে চাপ দিন? [বন্ধ]


293

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

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

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

  1. মূল থ্রেড না থামিয়ে কোনও পরিবর্তন পটভূমিতে প্রেরণ করা উচিত।
  2. এটি যতটা সম্ভব সামান্য ব্যান্ডউইথ ব্যবহার করা উচিত।

আমি বেশ কয়েকটি চ্যালেঞ্জ সম্পর্কে চিন্তা করেছি:

  1. সার্ভারে বিভিন্ন ডিভাইসের বিভিন্ন ডেটা স্টোরের জন্য অবজেক্ট আইডি সংযুক্ত রয়েছে কিনা তা নিশ্চিত করা। এটি বলতে গেলে, আমার কাছে অবজেক্ট আইডি এবং ডিভাইস আইডিগুলির একটি টেবিল থাকবে, যা ডাটাবেসে সঞ্চিত অবজেক্টের রেফারেন্সের মাধ্যমে আবদ্ধ। আমার কাছে একটি রেকর্ড থাকবে (ডাটাবেসআইডিড [এই টেবিলের সাথে অনন্য], অবজেক্টআইড [পুরো ডাটাবেসের আইটেমটির কাছে অনন্য], ডেটাফিল্ড 1, ডেটাফিল্ড 2), অবজেক্টআইডি ফিল্ডটি অন্য সারণি, অলওবজেক্টস: (অবজেক্টআইড, ডিভাইসআইডি, ডিভাইসঅবজেক্টআইডি) রেফারেন্স করবে। তারপরে, যখন ডিভাইসটি কোনও পরিবর্তন সেট আপ করে, এটি স্থানীয় ডেটা স্টোরের মূল ডেটা অবজেক্ট থেকে ডিভাইস আইডি এবং অবজেক্টআইডের সাথে পাস করবে। তারপরে আমার ক্লাউড সার্ভার অলবজেক্টস টেবিলের অবজেক্টআইডি এবং ডিভাইস আইডির বিপরীতে চেক করবে এবং প্রাথমিক সারণীতে পরিবর্তনের রেকর্ডটি খুঁজে পাবে।
  2. সমস্ত পরিবর্তনগুলি টাইমস্ট্যাম্প করা উচিত, যাতে সেগুলি একত্রিত করা যায়।
  3. ডিভাইসটি খুব বেশি ব্যাটারি না ব্যবহার করে সার্ভারটি পোল করতে হবে।
  4. স্থানীয় ডিভাইসগুলিতে সার্ভার থেকে পরিবর্তনগুলি গ্রহণ করা হলে / মেমরিতে থাকা যে কোনও কিছু আপডেট করতে হবে।

আমি এখানে নিখোঁজ কিছু আছে কি? এটি সম্ভব করার জন্য আমার কী ধরণের ফ্রেমওয়ার্কগুলির দিকে নজর দেওয়া উচিত?


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

ঠিক আছে. তথ্যের জন্য ধন্যবাদ - ক্রমাগত সার্ভারে পোলিং করা এবং লঞ্চের সময় আপডেটগুলি পরীক্ষা করার বাইরে, ডিভাইসটির আপডেট পাওয়ার কোনও উপায় আছে কি? অ্যাপটি একসাথে একাধিক ডিভাইসে খোলা থাকলে এটি কাজ করতে আগ্রহী am
জেসন

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

1
@ Dan2552: তোমরা যা বর্ণনা যেমন [দীর্ঘ পোলিং] [পরিচিত en.wikipedia.org/wiki/... এবং একটি মহান ধারণা, কিন্তু খোলা সংযোগ একটি মোবাইল ডিভাইসে ব্যাটারি এবং ব্যান্ডউইথ বেশ অনেক গ্রাস।
jhndodo

1
আপনার অ্যাপ্লিকেশন এবং ওয়েব পরিষেবার মধ্যে কীভাবে ডেটা সিঙ্ক করবেন সে বিষয়ে রেন্ডারলিচের একটি দুর্দান্ত টিউটোরিয়াল এখানে রয়েছে: raywenderlich.com/15916/…
জেআরজি-বিকাশকারী

উত্তর:


144

আমি আইডি 2009 কনফারেন্সে ড্যান গ্রোভারের দ্বারা আলোচিত সিঙ্ক কৌশলটি সাবধানতার সাথে পড়তে এবং বাস্তবায়নের পরামর্শ দিচ্ছি, এখানে পিডিএফ ডকুমেন্ট হিসাবে উপলব্ধ ।

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

ভেক্টর টাইম পেয়ারগুলির সাথে ফাইল সিঙ্ক্রোনাইজেশন

যা কিছু সুস্পষ্ট পরিবর্তন সহ কোর ডেটাতে সমানভাবে প্রযোজ্য। এটি সামগ্রিকভাবে অনেক বেশি দৃust় এবং নির্ভরযোগ্য সিঙ্ক কৌশল সরবরাহ করে তবে সঠিকভাবে প্রয়োগ করার জন্য আরও প্রচেষ্টা প্রয়োজন।

সম্পাদনা করুন:

দেখে মনে হচ্ছে গ্রোভারের পিডিএফ ফাইলটি আর উপলব্ধ নেই (ভাঙা লিঙ্ক, মার্চ 2015)। আপডেট: লিঙ্কটি এখানে ওয়ে ব্যাক মেশিনের মাধ্যমে উপলব্ধ

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


ZSync ভিডিওর জন্য কারও আপডেট লিঙ্ক আছে? এছাড়াও, জেডসিঙ্ক এখনও রক্ষণাবেক্ষণ করা হয়? আমি দেখছি এটি সর্বশেষে ২০১০ সালে আপডেট হয়েছিল
জেরেমি ওয়েলডিন

জিথসিঙ্কের গিথুবের প্রতি শেষ প্রতিশ্রুতি ছিল ২০১০ সালের সেপ্টেম্বরে, যা আমাকে বিশ্বাস করতে পরিচালিত করে যে মার্কাস এটি সমর্থন করা বন্ধ করে দিয়েছে।
পচনশীল ডেভ

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

1
@ প্যাট, অনুরোধ অনুসারে আমি আপনাকে কেবল পিডিএফ ফাইল পাঠিয়েছি। চিয়ার্স, ম্যাসিমো কাফেরো।
ম্যাসিমো ক্যাফারো

3
ড্যান গ্রোভারের অনুপস্থিত ক্রস-প্ল্যাটফর্ম ডেটা সিঙ্ক্রোনাইজেশন পিডিএফ স্লাইডগুলি ওয়েব্যাক মেশিনের মাধ্যমে অ্যাক্সেসযোগ্য।
ম্যাথু ক্যারিস

272

আপনি যা করার চেষ্টা করছেন তার অনুরূপ কিছু করেছি। আমি কী শিখেছি এবং কীভাবে করেছি তা আপনাকে বলি।

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

সিঙ্ক্রোনাইজেশনে সহায়তা করার জন্য আমি চারটি ক্ষেত্র যুক্ত করেছি:

  1. sync_status - কেবলমাত্র আপনার মূল ডেটা মডেলটিতে এই ক্ষেত্রটি যুক্ত করুন। আইটেমটিতে আপনার কোনও মুলতুবি পরিবর্তন আছে কিনা তা নির্ধারণ করতে এটি অ্যাপ ব্যবহার করে। আমি নিম্নলিখিত কোডগুলি ব্যবহার করি: 0 এর অর্থ কোনও পরিবর্তন নেই, 1 এর অর্থ এটি সার্ভারের সাথে সিঙ্ক্রোনাইজ হওয়ার জন্য সারিবদ্ধ, এবং 2 এর অর্থ এটি একটি অস্থায়ী অবজেক্ট এবং এটি শুদ্ধ হতে পারে।
  2. is_deleted - এটি সার্ভারে এবং কোর ডেটা মডেলে যুক্ত করুন। ইভেন্ট মোছা হ'ল ডেটাবেস থেকে বা আপনার ক্লায়েন্টের মডেলটি থেকে কোনও সারি মুছে ফেলা উচিত নয় কারণ এটি আপনাকে পিছনে সিঙ্ক্রোনাইজ করার মতো কিছুই রাখে না। এই সাধারণ বুলিয়ান পতাকাটি ধারণ করে, আপনি is_deleted 1 এ সেট করতে পারেন, এটি সিঙ্ক্রোনাইজ করুন এবং সবাই খুশি হবে। "Is_deleted = 0" দিয়ে অ মুছে ফেলা আইটেমগুলি অনুসন্ধান করতে আপনাকে অবশ্যই সার্ভার এবং ক্লায়েন্টের কোডটি পরিবর্তন করতে হবে।
  3. শেষ_মাংসিত - এটি সার্ভারে এবং কোর ডেটা মডেলে যুক্ত করুন। এই ফিল্ডটি স্বয়ংক্রিয়ভাবে সার্ভারের দ্বারা বর্তমান তারিখ এবং সময়ের সাথে আপডেট করা উচিত যখনই record রেকর্ডটিতে কিছু পরিবর্তন হয়। এটি কখনই ক্লায়েন্ট দ্বারা পরিবর্তন করা উচিত নয়।
  4. গাইড - সার্ভার এবং কোর ডেটা মডেলটিতে একটি বিশ্বব্যাপী অনন্য আইডি ( http://en.wikedia.org/wiki/Globally_unique_phanfier দেখুন ) ক্ষেত্রে যুক্ত করুন। এই ক্ষেত্রটি প্রাথমিক কী হয়ে যায় এবং ক্লায়েন্টে নতুন রেকর্ড তৈরি করার সময় গুরুত্বপূর্ণ হয়ে ওঠে। সাধারণত আপনার প্রাথমিক কীটি সার্ভারে একটি বর্ধনশীল পূর্ণসংখ্যা হয় তবে আমাদের মনে রাখতে হবে যে সামগ্রীটি অফলাইনে তৈরি করা যেতে পারে এবং পরে সিঙ্ক্রোনাইজ করা যায়। জিইউইডি আমাদের অফলাইনে থাকার সময় একটি কী তৈরি করতে দেয়।

ক্লায়েন্টে, যখনই কোনও পরিবর্তন হয় এবং সার্ভারে সিঙ্ক্রোনাইজ করা প্রয়োজন তখন আপনার মডেল অবজেক্টে সিঙ্ক_স্ট্যাটাস সেট করতে কোড যুক্ত করুন। নতুন মডেল অবজেক্টগুলিকে অবশ্যই একটি গিউডি তৈরি করতে হবে।

সিঙ্ক্রোনাইজেশন একটি একক অনুরোধ। অনুরোধটিতে রয়েছে:

  • আপনার মডেল অবজেক্টের ম্যাক্স শেষ_মোডিফাইড টাইম স্ট্যাম্প। এটি সার্ভারকে বলেছে আপনি কেবল এই সময়ের স্ট্যাম্পের পরে পরিবর্তন চান।
  • সিঙ্ক_স্ট্যাটাস = 1 সহ সমস্ত আইটেমযুক্ত একটি জেএসএন অ্যারে।

সার্ভারটি অনুরোধ পেয়েছে এবং এটি করে:

  • এটি JSON অ্যারে থেকে সামগ্রীগুলি নেয় এবং এতে থাকা রেকর্ডগুলিকে সংশোধন করে বা যুক্ত করে। সর্বশেষ_পরিবর্তিত ক্ষেত্রটি স্বয়ংক্রিয়ভাবে আপডেট হয়।
  • অনুরোধে প্রেরিত সময়ের চেয়ে বড় স্টাফ স্ট্যাম্প সহ সমস্ত বস্তু সমেত সার্ভার একটি জেএসএন অ্যারে প্রদান করে। এটি সবেমাত্র প্রাপ্ত বস্তুগুলিকে অন্তর্ভুক্ত করবে, যা একটি স্বীকৃতি হিসাবে রেকর্ডটি সফলভাবে সার্ভারের সাথে সিঙ্ক্রোনাইজ হয়েছিল।

অ্যাপ্লিকেশনটি প্রতিক্রিয়া গ্রহণ করে এবং এটি করে:

  • এটি JSON অ্যারে থেকে সামগ্রীগুলি নেয় এবং এতে থাকা রেকর্ডগুলিকে সংশোধন করে বা যুক্ত করে। প্রতিটি রেকর্ড 0 এর সিঙ্ক_স্ট্যাটাস সেট করে।

আমি আশা করি এটি সাহায্য করবে. আমি রেকর্ড এবং মডেল শব্দটি বিনিময়যোগ্যভাবে ব্যবহার করেছি, তবে আমি মনে করি আপনি ধারণাটি পেয়ে গেছেন। শুভকামনা।


2
স্থানীয় ডাটাবেসে সর্বশেষ-সম্পাদিত ক্ষেত্রটিও বিদ্যমান, তবে এটি আইফোনের ঘড়ির দ্বারা আপডেট হয়নি। এটি সার্ভার দ্বারা সেট করা হয়েছে এবং ফিরে সিঙ্ক্রোনাইজ করা হয়েছে। MAX (সর্বশেষ_মোডিফাইড) তারিখটি সেই তারিখের পরে সংশোধিত সমস্ত কিছু ফেরত পাঠাতে অ্যাপ্লিকেশনটিকে সার্ভারে প্রেরণ করে।
ক্রিস

3
ক্লায়েন্টের উপর একটি বৈশ্বিক মান প্রতিস্থাপন করতে পারে MAX(last_modified), তবে এটি MAX(last_modified)যথেষ্ট হবে না since sync_statusঅন্য ভূমিকা আছে। যেমনটি আমি আগে লিখেছি, MAX(last_modified)সার্ভার থেকে sync_statusকী সিঙ্ক করতে হবে তা নির্ধারণ করে এবং সার্ভারে কী সিঙ্ক করতে হবে তা নির্ধারণ করে।
ক্রিস

2
@ ফ্লেক্স_এডিক্টেড ধন্যবাদ হ্যাঁ, আপনি প্রতিটি সত্তার জন্য ক্ষেত্রগুলি প্রতিলিপি করতে হবে যা আপনি সিঙ্ক্রোনাইজ করতে চান। তবে কোনও সম্পর্কের সাথে মডেলকে সিঙ্ক্রোনাইজ করার সময় আপনাকে আরও বেশি যত্ন নিতে হবে (যেমন, 1-থেকে বহু)-
খ্রিস্ট

2
@ বেনপ্যাকার্ড - আপনি সঠিক। পদ্ধতির কোনও বিরোধ বিরোধ নিষ্পত্তি হয় না যাতে শেষ ক্লায়েন্ট জিততে পারে। একক ব্যবহারকারীর দ্বারা রেকর্ড সম্পাদনা করার পরে আমার অ্যাপগুলিতে এটি মোকাবেলা করতে হয়নি। আপনি কীভাবে এটি সমাধান করেন তা জানার জন্য আমি কৌতূহলী হব।
ক্রিস

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

11

আপনি যদি এখনও যাওয়ার উপায় খুঁজছেন তবে কাউচবেস মোবাইলটি দেখুন। এটি মূলত আপনার যা চান তা করে। ( http://www.couchbase.com/nosql- ডেটাবেসস /couchbase-mobile )


3
এটি কেবল আপনি যা চান তা করতে পারে যদি আপনি সম্পর্কিত ডেটার পরিবর্তে আপনার ডেটা দলিল হিসাবে প্রকাশ করতে পারেন। চারপাশে কাজ রয়েছে, তবে এগুলি সর্বদা সুন্দর বা মূল্যবান নয়।
জেরেমি ওয়েলডিন

ছোট অ্যাপ্লিকেশনগুলির জন্য নথিগুলি যথেষ্ট
হাই ফেং কাও

@radiospiel আপনার লিঙ্কটি নষ্ট হয়েছে
মিক

এটি একটি নির্ভরতা যুক্ত করবে যা ব্যাকএন্ডটি কাউচবেস ডিবিতে লেখা দরকার। এমনকি আমি সিঙ্ক করার জন্য এনওএসকিউএল ধারণাটি দিয়ে শুরু করেছিলাম তবে এমএস এসকিউএল ব্যাকএন্ডে চলমান থাকায় আমি আমার ব্যাকএন্ডকে NOSQL হতে সীমাবদ্ধ করতে পারি না।
থিমস্মাইনগাইন

@ মিক: এটি আবার কাজ করছে বলে মনে হচ্ছে (বা কেউ লিঙ্কটি স্থির করেছেন? আপনাকে ধন্যবাদ)
রেডিওস্পিল

7

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

কোন সত্তা এবং কোন কলামগুলি এটি সিঙ্ক করা উচিত এবং আপনার সার্ভারটি কোথায় তা আপনি কেবল ক্লাসকে বলবেন।

M3Synchronization * syncEntity = [[M3Synchronization alloc] initForClass: @"Car"
                                                              andContext: context
                                                            andServerUrl: kWebsiteUrl
                                             andServerReceiverScriptName: kServerReceiverScript
                                              andServerFetcherScriptName: kServerFetcherScript
                                                    ansSyncedTableFields:@[@"licenceNumber", @"manufacturer", @"model"]
                                                    andUniqueTableFields:@[@"licenceNumber"]];


syncEntity.delegate = self; // delegate should implement onComplete and onError methods
syncEntity.additionalPostParamsDictionary = ... // add some POST params to authenticate current user

[syncEntity sync];

আপনি উত্স, কার্যকারী উদাহরণ এবং আরও নির্দেশাবলী এখানে পেতে পারেন: github.com/knagode/M3 সিনক্রোনাইজেশন


আমরা যদি ডিভাইসের সময়টিকে অস্বাভাবিক মান হিসাবে পরিবর্তন করি তবে এটি ঠিক হবে?
গোল্ডেন

5

ধাক্কা বিজ্ঞপ্তির মাধ্যমে ডেটা আপডেট করার জন্য ব্যবহারকারীকে লক্ষ্য করুন। ক্লাউড সার্ভারের স্থানীয় ডেটা এবং ডেটা পরীক্ষা করতে অ্যাপ্লিকেশনটিতে একটি পটভূমি থ্রেড ব্যবহার করুন, যখন সার্ভারে পরিবর্তন ঘটে, স্থানীয় ডেটা পরিবর্তন করুন, তদ্বিপরীত।

সুতরাং আমি মনে করি সবচেয়ে কঠিন অংশটি হ'ল কোন দিকটি অবৈধ side

আশা করি এটি আপনাকে সহায়তা করতে পারে


5

আমি সাইনক্লাউড নামে পরিচিত আমার নতুন কোর ডেটা ক্লাউড সিঙ্কিং এপিআইর প্রথম সংস্করণ পোস্ট করেছি। আইক্লাউডের সাথে সিএনক্লাউডের প্রচুর পার্থক্য রয়েছে কারণ এটি মাল্টি-ব্যবহারকারী সিঙ্ক ইন্টারফেসের জন্য অনুমতি দেয়। এটি অন্যান্য সিঙ্কিং এপি-র থেকেও আলাদা কারণ এটি মাল্টি-টেবিল, রিলেশনাল ডেটার জন্য অনুমতি দেয়।

Http://www.syncloudapi.com এ আরও জানুন

আইওএস 6 এসডিকে দিয়ে তৈরি করুন, এটি 9/27/2012 পর্যন্ত খুব আধুনিক very


5
স্ট্যাক ওভারফ্লোতে স্বাগতম! আপনার উত্তর পোস্ট করার জন্য ধন্যবাদ! দয়া করে স্ব-প্রচারের এফএকিউ অবশ্যই মনোযোগ সহকারে পড়তে ভুলবেন না ।
অ্যান্ড্রু বারবার

5

আমি মনে করি জিইউইডি ইস্যুটির একটি ভাল সমাধান হ'ল "বিতরণকারী আইডি সিস্টেম"। আমি সঠিক শব্দটি কী তা নিশ্চিত নই, তবে আমি মনে করি এমএস এসকিউএল সার্ভার ডক্স এটি কল করার জন্য ব্যবহার করেছেন (এসকিউএল বিতরণ / সিঙ্কড ডাটাবেসের জন্য এই পদ্ধতিটি ব্যবহার করে / ব্যবহার করে)। এটি বেশ সহজ:

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

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

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


2

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

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

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

-- হালনাগাদ

কিছুক্ষণ পর, আমি চলে আসেন ensembles - আমি চাকা reinventing উপর এই সমাধান সুপারিশ।

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