__block variable

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

  • __block variable

    Hallo,

    auch auf die Gefahr hin, dass ich mich blamiere…die Blockvarialble "count" funktioniert nicht.
    Wenn ich in die Methode springe hat "count" keine Adresse und keinen Wert ( GDB ).
    Im Block selbst steht eine zufällige Zahl drin, die, wenn sie dekrementiert wird trotzdem den Wert behält.

    Falls jemand sieht was ich da falsch mache…schon mal im Voraus vielen Dank.

    Jürgen

    - (void)loadAssetsFromPhotoRoll
    {
    __block int count = 10;

    void (^assetEnumerator)(ALAsset *, NSUInteger, BOOL *) = ^(ALAsset *result, NSUInteger index, BOOL *stop)
    {
    if(result != nil)
    {
    count--;
    }
    };

    void (^assetGroupEnumerator)(ALAssetsGroup *, BOOL *) = ^(ALAssetsGroup *group, BOOL *stop)
    {
    if(group != nil && count>0)
    {
    [group enumerateAssetsUsingBlock:assetEnumerator];
    }else{
    *stop = YES;
    }
    };

    void (^assetFailureBlock)(NSError *) = ^(NSError *error)
    {

    };

    ALAssetsLibrary *assetsLibrary = [[ALAssetsLibrary alloc] init];
    [assetsLibrary enumerateGroupsWithTypes:ALAssetsGroupSavedPhotos usingBlock:assetGroupEnumerator failureBlock:assetFailureBlock];

    [assetsLibrary release];
    }
  • Hast Du schon mal probiert nur den assetEnumerator block separat zu benutzen.
    Es liegt wahrscheinlich an der Verschachtelung.
    Apple sagt, dass __block variablen im selben lexical scope liegen muss.
  • Dieser Code mit der Instance variablen funktioniert im Simulator als auch im Device.
    Ich habe festgestellt, dass der Code mit der __block Variablen im Simulator geht, im Device ( iPhone 4 IOS433 ) nicht…

    - (void)loadAssetsFromPhotoRoll
    {
    //__block NSInteger count = 10;

    self->testCount = 10;
    void (^assetEnumerator)(ALAsset *, NSUInteger, BOOL *) = ^(ALAsset *result, NSUInteger index, BOOL *stop)
    {
    if(result != nil && self->testCount>0)
    {
    self->testCount--;
    }else{
    *stop = YES;
    }
    };

    void (^assetGroupEnumerator)(ALAssetsGroup *, BOOL *) = ^(ALAssetsGroup *group, BOOL *stop)
    {
    if(group != nil && self->testCount>0)
    {
    [group enumerateAssetsUsingBlock:assetEnumerator];

    }else{
    *stop = YES;
    [self.entriesTableView reloadData];
    }
    };

    void (^assetFailureBlock)(NSError *) = ^(NSError *error)
    {

    };

    ALAssetsLibrary *assetsLibrary = [[ALAssetsLibrary alloc] init];
    [assetsLibrary enumerateGroupsWithTypes:ALAssetsGroupSavedPhotos usingBlock:assetGroupEnumerator failureBlock:assetFailureBlock];

    [assetsLibrary release];
    }
  • Hallo,

    hier nochmal eine konkrete Frage ob newImage so richtig verwendet wird.
    Ich habe den Code mal auf ein Minimum reduziert.
    Also ich möchte newImage das ausserhalb gesetzt wird im Block verwenden.
    Sollte eigentlich ganz einfach sein. Ich bekomme es nur nicht hin. :cursing:
    Eine Instanzvariable möchte ich nicht draus machen, da es auch so gehen soll.


    {
    UIImage *newImage = nil;

    ALAssetsLibraryWriteImageCompletionBlock writeImageCompletionBlock = ^(NSURL *assetURL ,NSError *error){
    NSData *imageData = UIImagePNGRepresentation (*newImage);
    //....
    };

    newImage = [info valueForKey:@"anImageKey"];

    ALAssetsLibrary* assetslibrary = [[ALAssetsLibrary alloc] init];
    [assetslibrary writeImageToSavedPhotosAlbum:newImage.CGImage metadata:nil completionBlock:writeImageCompletionBlock];
    }
  • Ich bin echt so doof…

    Was ich nicht begriffen hatte, war dass die ^ Anweisung eine ganz normale prozedurale Zeile im Code ist.
    Das heisst, dass der Block an dieser Stelle konstruiert wird und den Wert der __block / Objekts Variablen speichert.
    Der Wert der __block Variablen muss for der Konstruktion des Blocks zugewiesen werden.

    {
    UIImage *newImage = nil;

    newImage = [info valueForKey:@"anImageKey"];

    ALAssetsLibraryWriteImageCompletionBlock writeImageCompletionBlock = ^(NSURL *assetURL ,NSError *error){
    NSData *imageData = UIImagePNGRepresentation (*newImage);
    //....
    };

    ALAssetsLibrary* assetslibrary = [[ALAssetsLibrary alloc] init];
    [assetslibrary writeImageToSavedPhotosAlbum:newImage.CGImage metadata:nil completionBlock:writeImageCompletionBlock];
    }