ALAsset verändert sein wert

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • ALAsset verändert sein wert

    Hallo Leute,
    sorry wegen der Überschrift es ist aber immer so schwer eine passende Überschrift zu finden.
    ich habe eine Methode (filterValidPhotosInAssets) die gibt mir ein Array mit den gültigen Assets die ich brauche.
    Diese Methode wird in einer delegate Methode aufgerufen, die aufgerufen wird so bald ich mir alle Assets geholt habe.
    Ich füge das Array mit gefundenen Asset in ein Property was auch ein Array ist danach lade ich den TableView neu.
    wenn ich ein in der Delegate Methode ein PO mache auf mein Property dan sehe ich das alle Objekte hinzugefügt wurden.
    Wenn ich ein PO in der cellForRowAtIndexPath mache haben meine Asset keine URL mehr und der Type ist Unbekannt.


    Hier einmal der Code:

    Quellcode

    1. - (NSArray*)filterValidPhotosInAssets:(NSArray*)assets byDateBlocks:(NSArray*)dates
    2. {
    3. __block NSMutableArray *validPhotos = [NSMutableArray new];
    4. [assets enumerateObjectsUsingBlock:^(ALAsset *asset, NSUInteger idx, BOOL *stop) {
    5. if([self isValidAsset:asset byDates:dates]) {
    6. [validPhotos addObject:asset];
    7. }
    8. }];
    9. if(!validPhotos.count) {
    10. [validPhotos addObject:[UIImage imageNamed:@"dev_current_record_image@2x.png"]];
    11. }
    12. return validPhotos;
    13. }
    14. - (BOOL)isValidAsset:(ALAsset*)asset byDates:(NSArray*)dates
    15. {
    16. __block NSDate *creationDate = [NSDate dateTimeShiftWithDate:[asset valueForProperty:ALAssetPropertyDate]];
    17. __block BOOL isValid = NO;
    18. [dates enumerateObjectsUsingBlock:^(NSArray *periodOfTime, NSUInteger idx, BOOL *stop) {
    19. NSDate *startDate = periodOfTime.firstObject;
    20. NSDate *enddate = periodOfTime.lastObject;
    21. if([startDate compare:creationDate] == NSOrderedAscending &&
    22. [enddate compare:creationDate] == NSOrderedDescending
    23. ) {
    24. isValid = YES;
    25. }
    26. }];
    27. return isValid;
    28. }
    Alles anzeigen


    Quellcode

    1. - (void)photoEngine:(LCPhotoEngine*)photoEngine didFinishWithResults:(NSArray*)results{ for (NSString *activityName in self.activitys) { NSArray *dates = [LCPersistanceEngine datesByDatesBlockWithActivityName:activityName]; NSArray *validPhotos = [self.photoEngine filterValidPhotosInAssets:results byDateBlocks:dates]; [self.activitysImages addObject:validPhotos]; } NSBlockOperation *tableOperation = [NSBlockOperation blockOperationWithBlock:^{ [self.tableView reloadData]; [self.activityIndicatorView removeFromSuperview]; self.activityIndicatorView = nil; }]; [self.mainQuere addOperation:tableOperation];
    2. }



    Ich bedanke mich schon einmal im voraus für die Hilfe.
    MFG Marius










    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Marius Hartig ()

  • ich weiss jetzt warum es so ist weil ich dir das array in einem anderen Thread fülle aber wie kann ich das problem lösen.
    die didFinishWithResults wird auch nicht im main Thread aufgerufen.
    Die Frage wäre wie greife ich auf eine var zu in einem anderen Thread
  • Ich verstehe den Code ehrlich gesagt nicht wirklich. Warum ist denn validPhotos ein __block? Warum machst du das nicht als property und gut ist? Dann bestimmst du auch wie lange Du das hälst und wann du es wieder frei gibst.

    Und das das array in einem anderen Thread leer ist, weil es wo anders befüllt wurde ist Quatsch. Sowas gibt es nicht.

    Gruß

    Claus
    2 Stunden Try & Error erspart 10 Minuten Handbuchlesen.

    Pre-Kaffee-Posts sind mit Vorsicht zu geniessen :)
  • das array ist ja nicht leer die assets habe kein wert mehr.
    und ich habe validPhotos schon als Property deklariert gehabt hat leider auch nicht geholfen
    wenn ich die eine var in einem block benutzten will muss ich doch __ block benutzten
  • Ja aber du deklarierst die variable validPhotos als lokale variable in deiner Methode als _block, befüllst sie im Block und gibst sie dann zurück. In dem Moment wo deine Methode aber verlassen wird ist doch die Variable dann weg. Was du also zurück gibst ist nicht mehr vorhanden.

    Gruß

    Claus
    2 Stunden Try & Error erspart 10 Minuten Handbuchlesen.

    Pre-Kaffee-Posts sind mit Vorsicht zu geniessen :)
  • so habe noch einmal documentation gelesen und habe mein problem gefunden :D

    The lifetimes of objects you get back from a library instance are tied to the lifetime of the library instance.