1

こんにちは私はRiccardoで、インディー開発者です!

私がobjective-cでプログラミングを始めていることはそれほど多くありませんが、私はまだ初心者です!:D

私はCoreDataを学び始め、並行性に直面するまですべてが順調に進んでいました。Core Dataを使用すると、アプリは保存アクション中にブロックを続けていたため、バックグラウンドコンテキストでコアデータをグーグルで検索し、MagicalRecordを見つけました。

マギアレコードでコードの複雑さを大幅に軽減しました:)しかし、まだ1つの問題があります。マギアレコードに関するすべてを読み、さまざまな方法で修正しようとしましたが、UIのフリーズはまだあります:(だから私はしませんそれを修正する方法を知っています...

すべての方法に問題があると思いますが(フリーズUIを見ると)、リストされている4つの方法のうち3つは非常に高速であるため、認識できません。大きな問題として実際にフリーズに気付くことができる唯一の方法はこれです->

  • (void)persistAppsFromArray:(NSArray *)arrayOfApps inResearch:(NSDictionary *)info;

すべてのアプリオブジェクトを作成するために配列を取得し、これらのアプリをリサーチに関連付けた後(フェッチしてリサーチを見つけた後、辞書を使用して述語を作成します)。

これは私のコードです。実際には、コアデータを管理するクラス全体です。これらのメソッドを呼び出すクラスではキューやスレッドを使用しないので、ここで修正する必要があると思います:-/

よろしくお願いします:)

#import "CoreDataHelper.h"
#import "CoreData+MagicalRecord.h"


@implementation CoreDataHelper

#pragma mark - Research creator helper

+ (ResearchType *) fetchResearchWithDictionary: (NSDictionary *) info {

// Fetch
// predicates for fetch
NSPredicate * predicateCategory = [NSPredicate predicateWithFormat:@"researchCategory = %@" , [info objectForKey: @"Category"]];
NSPredicate * predicateType = [NSPredicate predicateWithFormat:@"researchType = %@" , [info objectForKey: @"Type"]];
 NSPredicate * predicatePrefix = [NSPredicate predicateWithFormat:@"researchPrefix = %@" , [info objectForKey: @"Prefix"]];

 NSArray * predicates = [NSArray arrayWithObjects: predicateCategory, predicateType, predicatePrefix, nil];

        // create the composite predicate
        NSPredicate * predicateComposito = [NSCompoundPredicate andPredicateWithSubpredicates:predicates];

    // obtain the result
    // Passo la ricerca al brain
   return [ResearchType MR_findFirstWithPredicate: predicateComposito];
}

   + (void)updateResearchWithDictionary:(NSDictionary *) info withCompletionBlock:(completion_block)updatedResearch {

    // Get the context
    NSManagedObjectContext *localContext    = [NSManagedObjectContext MR_context];

    // predicates
    NSPredicate * predicateCategory = [NSPredicate predicateWithFormat:@"researchCategory = %@" , [info objectForKey: @"Category"]];
    NSPredicate * predicateType = [NSPredicate predicateWithFormat:@"researchType = %@" , [info objectForKey: @"Type"]];
    NSPredicate * predicatePrefix = [NSPredicate predicateWithFormat:@"researchPrefix = %@" , [info objectForKey: @"Prefix"]];

    NSArray * predicates = [NSArray arrayWithObjects: predicateCategory, predicateType, predicatePrefix, nil];

    // composite predicate
    NSPredicate * predicateComposito = [NSCompoundPredicate andPredicateWithSubpredicates:predicates];

// create research object 
    ResearchType *research = [ResearchType MR_findFirstWithPredicate: predicateComposito inContext:localContext];



// new properties
    research.researchDate      = [info objectForKey:@"Research Date"];
    research.researchLimit     = [info objectForKey:@"Limit"];
    //research.apps              =  nil;

  [localContext MR_saveInBackgroundCompletion:^{

      updatedResearch(research);

  }];
 }

   + (void) persistResearchWithDictionary: (NSDictionary *) info withCompletionBlock:(completion_block)savedResearch {

// Get the context
NSManagedObjectContext *localContext    = [NSManagedObjectContext MR_context];

// Create a new Person in the current thread context
ResearchType * research   = [ResearchType MR_createInContext:localContext];

// Set properties
research.researchCategory    = [info objectForKey:   @"Category"];
research.researchPrefix      = [info objectForKey:   @"Prefix"];
research.researchCategoryUrl = [info objectForKey:   @"Category Code Url"];
research.researchType        = [info objectForKey:   @"Type"];


research.researchCountry     = [info objectForKey:   @"Country"];
research.researchCountryCode = [info objectForKey:   @"Country Code"];
research.researchDate        = [info objectForKey:   @"Research Date"];
research.researchDevice      = [info objectForKey:   @"Device"];
research.researchLimit       = [info objectForKey:   @"Limit"];

// Save changes
 [localContext MR_saveInBackgroundCompletion:^{

   savedResearch(research);
 }];

 }

    + (void) persistAppsFromArray: (NSArray *) arrayOfApps inResearch: (NSDictionary *) info  {


// Get the local context
    NSManagedObjectContext *localContext    = [NSManagedObjectContext MR_context];

 [localContext MR_saveInBackgroundCompletion:^{


     // predicates
     NSPredicate * predicateCategory = [NSPredicate predicateWithFormat:@"researchCategory = %@" , [info objectForKey: @"Category"]];
     NSPredicate * predicateType = [NSPredicate predicateWithFormat:@"researchType = %@" , [info objectForKey: @"Type"]];
     NSPredicate * predicatePrefix = [NSPredicate predicateWithFormat:@"researchPrefix = %@" , [info objectForKey: @"Prefix"]];

     NSArray * predicates = [NSArray arrayWithObjects: predicateCategory, predicateType, predicatePrefix, nil];

     // Composite predicate
     NSPredicate * predicateComposito = [NSCompoundPredicate andPredicateWithSubpredicates:predicates];

     ResearchType * researchBgContext = [ResearchType MR_findFirstWithPredicate: predicateComposito];

     for (NSDictionary * info in arrayOfApps) {

         AppInDb * app             = [AppInDb MR_createEntity];

         app.appName                  = [info objectForKey: @"App Name"];
         app.appItunesLink            = [info objectForKey: @"iTunes Link"];
         app.appBundleID              = [info objectForKey: @"Bundle ID"];
         app.appID                    = [info objectForKey: @"ID"];
         app.appPriceLabel            = [info objectForKey: @"Price Label"];
         app.appReleaseDate           = [info objectForKey: @"Release Date String"];
         app.appIconImageLink         = [info objectForKey: @"Image Link 100"];
         app.appDeveloperPageLink     = [info objectForKey: @"Developer Page Link"];
         app.appDeveloper             = [info objectForKey: @"Developer"];
         app.appRights                = [info objectForKey: @"Rights"];
         app.appDescription           = [info objectForKey: @"App Description"];
         app.appCategory              = [info objectForKey: @"App Category"];
         app.appCategoryNumber        = [info objectForKey: @"Category Number For Url"];


         // adding app to the related research (one to many relationship)
         [researchBgContext addAppsObject:app];



           }
       }];

     }
4

1 に答える 1

2

この方法で試してください:

[MagicalRecord saveInBackgroundWithBlock:^(NSManagedObjectContext * localContext)block {}];

使用できる方法は他にもたくさんありますが、これで良いスタートを切ることができます。MagicalRecordはコンテキストを作成し、すべてがバックグラウンドスレッドで実行されます。また、親コンテキストに自動的に保存されます。

MagicalRecordの背後にいるSaulMoraによる、頭痛の種のないコアデータとスレッドというすばらしい記事を読むことをお勧めします。これは、MagicalRecordの多くの利点について説明する素晴らしい読み物です。

幸運を!

于 2012-10-25T01:11:52.493 に答える