multithreading - কোরডেটা: সতর্কতা: নামযুক্ত শ্রেণি লোড করতে অক্ষম




core-data swift (8)

সুইফট 2 / এক্সকোডি 7 আপডেট:

অ্যাপল দ্বারা সুইফট 2 এবং এক্সকোড 7 বিটা প্রকাশে এই ইস্যুটি (এই উত্তরটিতে আমার 3 এপ্রিলের মন্তব্যটিও দেখুন) সমাধান করা হয়েছে। তাই আপনার এখন ক্লাসের নামের আগে মুন্ডি বা " MyAppName. " ব্যবহার করে @objc(myEntity) এর দরকার নেই। এটি কাজ বন্ধ করবে। সুতরাং এগুলি সরান, কেবল ফাইলের মধ্যে Class নাম দিন এবং মডিউল এবং চিয়ার্স হিসাবে Current Working Module নির্বাচন করুন!

তবে যারা @objc(myEntity) আমার মত @objc(myEntity) ব্যবহার করছেন তাদের জন্য, আপনি পরিবর্তে এই অন্যান্য সমাধানটি ব্যবহার করতে পারেন যা @objc(myEntity) কাজ করে।

Xcdatamodel সঠিক শ্রেণিতে in এটির মতো দেখতে হবে:

আপনি এখানে যান। Module.Class সুইফট এবং এক্সকোড C-এ কোরিডাটার প্যাটার্ন .. মডেল পলিসি বা অন্যান্য কোরডাটা স্টাফের কাস্টম পলিসি ক্লাস ব্যবহার করার সময় আপনার একই পদ্ধতিটিও প্রয়োজন হবে। একটি দ্রষ্টব্য: ছবিতে, নাম এবং শ্রেণিটি কার এবং মাই অ্যাপনেম.কার (অথবা আপনার সত্তার নাম যাই হোক না কেন) হওয়া উচিত। এখানে, User একটি টাইপো হয়।

আমি এক্সকোড .1.১ ব্যবহার করে একটি নতুন সোফ্ট সংস্করণে একটি বিদ্যমান অবজেক্টিভ-সি টিভি শো অ্যাপ্লিকেশনটি নকল করছি এবং কোরডেটা নিয়ে কিছু সমস্যা রয়েছে।

আমি 4 টি সত্তার একটি মডেল তৈরি করেছি, তাদের এনএস-ম্যানেজডঅবজেক্ট সাবক্লাস তৈরি করেছি (সুইফটে) এবং সমস্ত ফাইলের উপযুক্ত অ্যাপ্লিকেশন লক্ষ্যমাত্রা সেট আছে ('সংকলন উত্সগুলির জন্য')।

আমি যখনই কোনও নতুন সত্ত্বা sertোকানোর চেষ্টা করি তখনও আমি এই ত্রুটিটি পাচ্ছি:

কোরডেটা: সতর্কতা: সত্তা 'শো' এর জন্য 'শো' নামে শ্রেণি লোড করতে অক্ষম। পরিবর্তে ডিফল্ট NSManagedObject ব্যবহার করে ক্লাস পাওয়া যায় নি।

কয়েকটি মন্তব্য:

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

lazy var managedObjectContext: NSManagedObjectContext? = {
  // Returns the managed object context for the application (which is already bound to the persistent store coordinator for the application.) This property is optional since there are legitimate error conditions that could cause the creation of the context to fail.
  let coordinator = self.persistentStoreCoordinator
  if coordinator == nil {
    return nil
  }
  var managedObjectContext = NSManagedObjectContext(concurrencyType: NSManagedObjectContextConcurrencyType.MainQueueConcurrencyType)
  managedObjectContext.persistentStoreCoordinator = coordinator
  return managedObjectContext
}()

এবং ডেটা ব্যবহার করে সংরক্ষণ করে:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), { () -> Void in
  var context = NSManagedObjectContext(concurrencyType: NSManagedObjectContextConcurrencyType.PrivateQueueConcurrencyType)
  context.parentContext = self.managedObjectContext!
  ...rest of core data saving code here...
})

আপনার কাস্ট করতে পারার সময় আপনাকেও অন্তত এক্সকোড .3.৩.২ সহ মডিউল ব্যবহার করতে হবে lass ক্লাস উদাহরণস্বরূপ: আপনার মডিউল (অর্থাত্ পণ্যের নাম) ধরে নেওয়া খাদ্য এবং আপনার শ্রেণি ফল

let myEntity =  NSEntityDescription.entityForName("Fruit", inManagedObjectContext: managedContext)

let fruit = NSManagedObject(entity: myEntity!, insertIntoManagedObjectContext:managedContext) as! Food.Fruit

সংক্ষিপ্তবৃত্তি:

  • ডেটা মডেল এডিটরে সত্তা নির্ধারণের সময় মডিউল নাম অন্তর্ভুক্ত করুন (নাম: ফল, শ্রেণি: খাদ্য.ফর্ট)
  • কোডে সত্তা অ্যাক্সেস করার সময় (ieSWIFT), এটি মডিউল.ক্লাসের মাধ্যমে কাস্ট করুন (উদাহরণস্বরূপ Food.Fruit)

আমার জন্য যা কাজ করেছে (এক্সকোড .4.৪, সুইফট) শ্রেণি নামটি <my actual class name>.<entity name> সত্তা পরিদর্শক, 'শ্রেণি' বাক্সে পরিবর্তন করছে।

পরিচালিত অবজেক্ট সাবক্লাসের আমার সূচনাটি দেখতে এরকম দেখাচ্ছে:

    convenience init(<properties to init>) {
    let entityDescr = NSEntityDescription.entityForName("<entity class name>", inManagedObjectContext: <managed context>)
    self.init(entity: entityDescr!, insertIntoManagedObjectContext: <managed context>)}
    //init properties here


এক্সকোড .1.১.১ এ আপনাকে @objc অ্যাট্রিবিউট যুক্ত করার দরকার নেই যেহেতু বেস সত্তাটি একটি অবজেক্ট ক্লাসের একটি উপসেট (NSManagedObject) ( সুইফট প্রকারের সামঞ্জস্যতা দেখুন C কোরডাটাতে পুরো মডিউল। ক্লাসের নাম আবশ্যক aware মডিউলটি সচেতন থাকুন নাম সেটিংস সেটিংসে -> প্যাকেজিং -> পণ্যের মডিউল নাম সেট করা আছে default ডিফল্টরূপে এটি $ (PRODUCT_NAME: c99extidentifier) ​​এ সেট করা থাকে যা লক্ষ্যমাত্রার নাম হবে


এক্সকোড 7 বিটা 2 (এবং আমি বিশ্বাস করি 1), মডেল কনফিগারেশনে File টাইপের একটি নতুন পরিচালিত অবজেক্ট মডিউল Current Product Module .File সেট করা হয়েছে এবং অবজেক্টের শ্রেণি .File হিসাবে কনফিগারেশনে প্রদর্শিত হবে।

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


প্রশ্নে ক্লাসের সাথে @objc(NameOfClass) রেখে ডেটা মডেল এডিটরে সত্তা শ্রেণীর নাম পরিবর্তন করা এবং ক্লাস ঘোষণার ঠিক উপরে প্রতিটি @objc(NameOfClass) ফাইলের সাথে @objc(NameOfClass) করা ইউনিট পরীক্ষার সময় আমার জন্য এই সমস্যাটি সমাধান করেছে solved


@objc(MyClass) 7 এবং বিশুদ্ধরূপে সুইফ্ট ব্যবহার করার সময়, আমাকে আসলে আমার অটো-উত্পাদিত @objc(MyClass) সাবক্লাস ( সম্পাদক থেকে উত্পন্ন> @objc(MyClass) সাবক্লাস তৈরি করুন ... ) থেকে @objc(MyClass) সরাতে @objc(MyClass)





nsmanagedobject