Ich habe eine Kategorie für meine NSURL
, um meine DataModel
für den Zugriff auf meine Modellobjekte später festlegen. Hier meine DataModel
ist subclassed meiner Core Data Einheit (NSManagedObject)
NSURL + Kategorie mit NSURLSessionDownloadTask
@implementation NSURL (CustomizedObject)
static char PROPERTY_KEY;
@dynamic model;
- (void)setChunk:(DataModel *)model {
objc_setAssociatedObject(self, &PROPERTY_KEY, model, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
- (DataModel *)model {
return (DataModel *)objc_getAssociatedObject(self, &PROPERTY_KEY);
}
@end
Also, ich meine Daten durch NSURLSessionDownloadTask
for (DataModel *model in models) { // Here 985 URLs are there
if ([model.status integerValue] == 0) {
NSURL *requestURL = [NSURL URLWithString:model.downloadSequence];
[requestURL setModel:model];
NSURLSessionDownloadTask *downloadTask = [self.session downloadTaskWithURL:requestURL];
[downloadTask resume];
[self.arrFileDownloadData addObject:downloadTask];
}
}
Herunterladen und, Ich greife auf meine DataModel
in jedem erfolgreichen Download,
- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didFinishDownloadingToURL:(NSURL *)location
{
self.downloadSuccessCount++;
DownloadModel *model = downloadTask.originalRequest.URL.model;
NSString *filePath = [model.content.filePath stringByAppendingPathComponent:[[model.streamingSequence lastPathComponent] stringByDeletingPathExtension]];
NSError *error;
NSFileManager *fileManager = [NSFileManager defaultManager];
NSURL *destinationURL = [NSURL fileURLWithPath:filePath];
if ([fileManager fileExistsAtPath:[destinationURL path]]) {
[fileManager removeItemAtURL:destinationURL error:nil];
}
BOOL success = [fileManager copyItemAtURL:location toURL:destinationURL error:&error];
if (success) {
NSError *fetchError = nil;
NSFetchRequest *fetch = [NSFetchRequest fetchRequestWithEntityName:ChunkCoreData];
[fetch setPredicate:[NSPredicate predicateWithFormat: @"modelId == %@", model.modelId]];
NSArray *isProductExist = [self.context executeFetchRequest:fetch error:&fetchError];
if ([isProductExist count] != 0) {
DataModel *fetchedModel = [isProductExist lastObject];
fetchedModel.status = [NSNumber numberWithInt:2];
// create writer MOC
NSManagedObjectContext* _privateWriterContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
[_privateWriterContext setPersistentStoreCoordinator:[[self managedObjectContext] persistentStoreCoordinator]];
// create main thread MOC
NSManagedObjectContext* _managedObjectContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
_managedObjectContext.parentContext = _privateWriterContext;
NSError *saveError = nil;
if (![_privateWriterContext save:&saveError]) {
NSLog(@"Couldn't save %@", saveError.localizedDescription);
}
}
}
}
Alles funktioniert, außer manchmal in Ordnung. Ich erhalte Absturz in,
NSURL *destinationURL = [NSURL fileURLWithPath:filePath];
zu sagt, dass filePath
null ist. Oder das Problem ist mit meiner NSURL
Kategorieerstellung?
Was mache ich hier falsch? Vorschläge bitte.
Wie funktioniert die Kombination von 'char' und' OBJC_ASSOCIATION_RETAIN_NONATOMIC'? – Droppy
@Droppy Dann, was ich sonst noch geben muss, um auf mein 'DataModel' zuzugreifen, um über' NSURL' zuzugreifen, bin ich sehr neu in * Categories * – Praveenkumar
Ja mein Fehler; Betrachten wir [diese] (http://stackoverflow.com/a/8733320/3588973) Antwort, dass * * ist, wie es mit Kategorien gemacht wird. Ich benutze sie selten, da sie die Dinge nur komplizieren und ich mag * einfach *. – Droppy