2012-04-02 9 views
1

In meiner App erlaube ich dem Benutzer, Fotos zu machen, um mit einer bestimmten Aufgabe zu verbinden. Mein Ansatz war es, diese category zu verwenden, um eine ALAsetsGroup mit einem benutzerdefinierten Namen zu erstellen und die Fotos darin zu speichern. Das Problem entsteht, wenn ich alle diese Fotos ergreife und sie als Miniaturbilder zeige. Ich packte die Vermögenswerte wie folgt aus:Auflisten von ALAssetsLibrary

- (void)setImagesForTask:(Task *)task { 
//clear images associated with the task so we don't double up. 
    [task clearImages]; 
    //static instance of ALAssetsLibrary 
     lib = [JobStore defaultAssetsLibrary]; 
     dispatch_queue_t queue = dispatch_get_main_queue(); 
     dispatch_async(queue, ^(void){ 
      [lib enumerateGroupsWithTypes:ALAssetsGroupAlbum 
           usingBlock:^(ALAssetsGroup *group, BOOL *stop) { 
            NSLog(@"group:%@", group); 
            //find my custom photo album and if it's there, enumerate through it. 
            if (group != nil && [[group valueForProperty:ALAssetsGroupPropertyName] isEqualToString: 
               [NSString stringWithFormat:@"Media for %@", task.title]]) { 
             if (group.numberOfAssets != 0) { 
             [group enumerateAssetsUsingBlock:^(ALAsset *result, NSUInteger index, BOOL *stop) { 
              if (result != nil) { 
               CGImageRef imgRef = [[result defaultRepresentation] fullScreenImage]; 
               UIImage *img = [UIImage imageWithCGImage:imgRef]; 
               //methods to resize the image and get PNG representations… 
               [task setThumbnailDataFromImage:img]; 
               [task setLargeImageDataFromImage:img]; 
               NSLog(@"saved image to: %@", group); 
              } else if (result == nil){ 
               NSLog(@"enumeration of assets ended"); 
               } 
              }]; 
             } 
            //if the group isn't there... 
            } else if (group == nil) { 
            //this method removes a UIView with a UIActivityIndicatorView that appears while enumeration occurs. 
             [self performSelectorOnMainThread:@selector(removeView) 
                   withObject:nil 
                  waitUntilDone:NO]; 
             NSLog(@"enumeration of groups ended"); 
            }} 
          failureBlock:^(NSError *error) { 
           NSLog(@"FAILURE"); 
          }]; 
     }); 
    JobStore *js = [JobStore defaultStore]; 
    [js saveChanges]; 
} 

Dies ist die Ausnahme, die ich bekomme:

2012-04-02 10:05:26.585 MyApp[2746:7d3b] *** Terminating app due to uncaught exception 'NSRangeException', reason: '*** -[NSOrderedSet enumerateObjectsAtIndexes:options:usingBlock:]: index 0 beyond bounds for empty ordered set' 

Die Ausnahme wirft am enumerateAssetsUsingBlock: Methode. Dies ist besonders anfällig, wenn ich Fotos zu einer Aufgabe hinzufüge, zu einer anderen navigiere und ihr Fotos hinzufüge. Eine seltsame Sache ist, dass, bevor die Ausnahme ausgelöst wird, habe ich dies in meinem Log:

2012-04-02 10:05:26.580 MyApp[2746:707] group:ALAssetsGroup - Name:Media for (current task), Type:Album, Assets count:1 

die Anlagengruppe also nicht wirklich leer ist, aber wenn ich versuche, innerhalb sie zu aufzuzählen Vermögen, meine app scheint zu denken, dass da nichts ist. Es scheint mir, dass, vielleicht weil ich diese Enumerationen geschachtelt habe und/oder die Blöcke im Hintergrund ausführen, aber die Methoden sofort zurückkehren, versuche ich eine Assets-Gruppe aufzuzählen, bevor meine App weiß, dass sie irgendetwas enthält. Gibt es eine beste Möglichkeit, dies zu erreichen? Ich denke, es gibt etwas Grundlegendes, das ich nicht verstehe, wie die Blöcke dieser Methoden ausgeführt werden. Jede Eingabe würde sehr geschätzt werden.

+0

Dank diejenigen von Ihnen, die diese Frage angesehen. Ich glaube, ich habe es gelöst und das Problem war eine schlechte Design-Entscheidung meinerseits. Ich werde heute eine Antwort schreiben, kann aber noch nicht wegen zu wenig Rep. – geraldWilliam

Antwort

0

Ich fand, dass der Versuch, Vermögenswerte aus der Bibliothek mithilfe der obigen Aufzählung zu greifen und zu versuchen, die darauf basierende UI zu aktualisieren, völlig unzuverlässig war. Ich überlegte mein Design und jetzt mache ich diese Aufzählung beim App-Start, um sicherzustellen, dass ich alle Fotos habe, die ich vorher gemacht habe. Wenn ich jedoch ein neues Foto anwende, füge ich es einfach zu einem NSMutableArray hinzu und ändere meine Benutzeroberflächeneinstellungen von diesem Array, anstatt zu versuchen, von ALAssentsLibrary erneut zu sammeln. Sobald meine Benutzeroberfläche aktualisiert wurde, speichere ich einfach im Hintergrund in meinem benutzerdefinierten Fotoalbum. Dies funktioniert zuverlässig und ist viel schneller als der Versuch, diese Aufzählung durchzuführen.

0

Das Problem mit dieser Lösung ist, dass wenn Benutzer Fotos hinzufügen oder etwas mit ihrer Fotobibliothek tun, Sie nicht einfach aktualisieren werden. Abfangen von Benachrichtigungen und solche können es möglich machen, aber immer noch.

fand ich einen Weg, diesen Bereich Ausnahme zu lösen, die ich hier gepostet: ALAssetsLibrary seems to return wrong number of my photos

Verwandte Themen