4

以下のメソッドで返したいブロックから取得している値があります。ブロックが非同期であるように見えるので、どうすればこれを達成できますか?

-(UIImage*) imageAtIndex:(NSUInteger)index
{
    UIImage *image;
    [self.album enumerateAssetsAtIndexes:[NSIndexSet indexSetWithIndex:index] options:0 usingBlock: ^(ALAsset *result, NSUInteger index, BOOL *stop)
     {
            //set image in here
     }];

    return image;
}
4

2 に答える 2

2

私は過去にこのようにそれをしました、それをチェックしてください。

-(void) imageAtIndex:(NSUInteger)index //since block is async you may not be able to return the image from this method
{

    UIImage *image;
    [self.album enumerateAssetsAtIndexes:[NSIndexSet indexSetWithIndex:index] options:0 usingBlock: ^(ALAsset *result, NSUInteger index, BOOL *stop)
     {
         //set image in here
          dispatch_async(dispatch_get_main_queue(), ^{ //if UI operations are done using this image, it is better to be in the main queue, or else you may not need the main queue.
             [self passImage:image]; //do the rest of the things in `passImage:` method
          });
     }];
}
于 2012-12-07T07:18:05.983 に答える
2

ブロックが非同期の場合、メソッドが終了する前にプログラムが非同期タスクを完了していない可能性があるため、isを返す前に戻り値を設定することはできません。いくつかのより良い解決策は次のとおりです。

  1. 必要に応じて、同じ仕事をする同期方法を見つけてください。
    ブロックの実行中にUIがロックされるため、これは最善の選択ではない可能性があります。

  2. 値が見つかったらセレクターを呼び出し、メソッド自体を無効にします。

パーチャンス、次のようなものを試してください:

-(void) findImageAtIndex:(NSUInteger)index target:(id)target foundSelector:(SEL)foundSEL
{
    __block UIImage *image;
    [self.album enumerateAssetsAtIndexes:[NSIndexSet indexSetWithIndex:index] options:0 usingBlock: ^(ALAsset *result, NSUInteger index, BOOL *stop)
    {
        //set image in here
        if ([target respondsToSelector:foundSEL]) { //If the object we were given can call the given selector, call it here
            [target performSelector:foundSEL withObject:image];
            return;
        }
    }];
    //Don't return a value
}

次に、次のように呼び出すことができます。

    ...
    //Move all your post-finding code to bar:
    [self findImageAtIndex:foo target:self foundSelector:@selector(bar:)];
}

- (void)bar:(UIImage *)foundImage {
     //Continue where you left off earlier
     ...
}
于 2012-12-07T07:28:30.537 に答える