, Core Data, ( ), "".
, NSOperationQueue, ASI-. - , . , 30 ( ), 15 . . , , , , NSBlockOperations, . , ...
for (NSArray *objectParts in objectsToDownload) {
Object *obj = [Object insertIntoManagedObjectContext:self.moc];
NSBlockOperation *processBlock = [NSBlockOperation blockOperationWithBlock:^{
[obj performPostProcessing];
}];
for (NSURL *part in objectParts) {
ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:part];
[request setDelegate:self];
[request setDidFailSelector:@selector(partRequestDidFail:)];
[request setDidFinishSelector:@selector(partRequestDidFinish:)];
NSMutableDictionary *userInfo = [NSMutableDictionary dictionaryWithObjectsAndKeys:obj, @"Object", nil];
[request setUserInfo:userInfo];
[processBlock addDependency:request];
[networkQueue addOperation:request];
}
[workerQueue addOperation:processBlock];
}
, didFinish :
- (void)partRequestDidFinish:(ASIHTTPRequest *)request {
NSData *data = [request responseData];
Object *obj = [[request userInfo] objectForKey:@"Object"];
[obj storePartialDataForPostProcessing:data];
}
, , - , NSObject. , (, , , MOC , :
- (NSManagedObjectContext *)moc {
NSManagedObjectContext *aContext = [[UIApplication sharedApplication] managedObjectContext;
[aContext setMergePolicy:NSMergeByPropertyStoreTrumpMergePolicy];
NSNotificationCenter *nc = [NSNotificationCenter defaultCenter];
[nc addObserver:self selector:@selector(mergeChangesFromMOC:) name:NSManagedObjectContextDidSaveNotification object:aContext];
return aContext;
}
- (void)mergeChangesFromMOC:(NSNotification *)aNotification {
@try {
[self.managedObjectContext mergeChangesFromContextDidSaveNotification:aNotification];
NSNotificationCenter *nc = [NSNotificationCenter defaultCenter];
[nc removeObserver:self name:NSManagedObjectContextDidSaveNotification object:[aNotification object]];
}
@catch (NSException * e) {
NSLog(@"Stopping on exception: %@", [e description]);
}
@finally {}
}
- , , MOC . . , , .
, , . , 15 , .