2016-07-21 24 views
0

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.

+0

Wie funktioniert die Kombination von 'char' und' OBJC_ASSOCIATION_RETAIN_NONATOMIC'? – Droppy

+0

@Droppy Dann, was ich sonst noch geben muss, um auf mein 'DataModel' zuzugreifen, um über' NSURL' zuzugreifen, bin ich sehr neu in * Categories * – Praveenkumar

+0

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

Antwort

0

Ich weiß, dass NSURLSession tut nicht Griff Subklassen von NSURLRequest; Es war ein Desaster in iOS 7, Borderline unbrauchbar in iOS 8 und immer noch ziemlich Buggy in iOS 9.

Ich denke, das ist, weil die Objekte zu einem Plist serialisiert werden, auch wenn die Anfragen in Bearbeitung sind. Ich vermute, dass Sie die gleichen Fehler treffen sind, die ich habe, in diesem Fall im Zusammenhang Objekte auf NSURLRequest oder NSURL sind wahrscheinlich ebenso problematisch.

Als Alternative sind hier einige andere Techniken, die besser für Sie arbeiten könnte:

  • Verwenden setProperty:forKey:inRequest: und property:forKey:inRequest: auf dem NSURLRequest Objekt statt.
  • Fügen Sie für Nicht-Hintergrundsitzungen dem Task stattdessen verknüpfte Objekte hinzu.
  • Erstellen Sie ein Wörterbuch, das das URL-Anforderungsobjekt den gewünschten Daten zuordnet.

HTH.