user4951
user4951

Reputation: 33050

problem with saving data at coredata?

In my application there is searchBar. when we input a text, it will do functionGrab (grab data from internet and save it to coredata), example :

if we input "Hallo"

    if([[dict objectForKey:@"Category"] isNotEmpty] && [[[dict objectForKey:@"Category"] objectAtIndex:0] class]!=[NSNull class]){
        NSMutableArray * DownloadedTags =[dict objectForKey:@"Category"];
        NSMutableSet * TagsReturn=[NSMutableSet set];
        for(int i=0;i<[DownloadedTags count];i++){
            NSString * Value=[DownloadedTags objectAtIndex:i];
            Tag * thisTag= (Tag*)[GrabClass getObjectWithStringOfValue:Value fromTable:@"Tag" withAttribut:@"Name"];
            [TagsReturn addObject:thisTag];
        }
        NSMutableSet * manyManagedObjects = [BusinessToSave mutableSetValueForKey:@"Tags"];
        [self removeDifferenceBetween2MutableManagedObjectSets:manyManagedObjects withDownloadedVersion:TagsReturn];
    }

So each biz has many categories. WHat happen in multi threaded application is one thread put category. The other thread also put the same category before committing.

So, [GrabClass getObjectWithStringOfValue:Value fromTable:@"Tag" withAttribut:@"Name"]; gives a new object even though some other thread already created the same object without knowing it.

If I synchronized the whole thing that the code would run serially and that'll be slow.

functionGrab:"H"
functionGrab:"Ha"
functionGrab:"Hal"
functionGrab:"Hall"
functionGrab:"Hallo"

something like,it do that functionGrab 5 times

I want to make functionGrab at background, but the problem is when I do that function without synchronized it will save more than one of data, so the result is there are 5 hallo words in my coredata, but if I do that with synchronized, it spent so much time, so slow..

is there any way to help my problem?

Upvotes: 0

Views: 79

Answers (1)

Marcus S. Zarra
Marcus S. Zarra

Reputation: 46718

I do not recommended having more than one thread "creating" the same types of data for the exact reason you are running into.

I would suggest you queue all of your "creates" into a single thread and a single NSManagedObjectContext to avoid merge or duplication issues.

The other option would be to make the app Lion only and use the parent/child NSManagedObjectContext design and then your children will be more "aware" of each other.

Upvotes: 1

Related Questions