こんにちは私は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];
}
}];
}