0

ブロック文についての質問です。私の質問は、ブロック文の変数を取り出す方法です。私のコードを見てください。以下のコードはうまく動作しません。

__block NSURL *ssURL
AFJSONRequestOperation *operation = 
[AFJSONRequestOperation JSONRequestOperationWithRequest:request success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) {
    ssURL = [NSURL URLWithString:[JSON valueForKeyPath:@"screenshot"]];
    [self currentEntry].ogImageURL = ssURL;
    NSLog(@"%@", ssURL); // -> "http://correct.address"   
} failure:nil];
[operation start];

また、変数 ogImageURL を以下のように設定します。

@property (copy, atomic) NSURL *ogImageURL;

完了ブロックのうち、NSLog には明らかに「(null)」が表示されます。ブロック文の外で変数を使いたい。変ですね。

セルが呼び出して配列に自己情報を取得するテーブルビューを作成したいので、ブロックの外側から変数を取得する必要があります。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell = nil;
    if (indexPath.row < self.itemsArray.count) {
        cell = [tableView dequeueReusableCellWithIdentifier:@"Cell"];

        UIImageView *imageViewOgImage = (UIImageView *)[cell viewWithTag:5];
        NSURL *ogImageURL = [[self.itemsArray objectAtIndex:indexPath.row] ssURL];

完全なソースは、この 186 行目です: https://github.com/weed/p120711_TechMovie/blob/120723/TechMovie/RSSParser.m

4

2 に答える 2

3

これは範囲の問題ではなく、タイミングの問題です

最初の例では、画像ビューはブロック内に設定されています。つまり、ssURL値が設定された後にのみ発生します。

2 番目の例では、ブロックが作成されますが、画像ビューが設定される前に呼び出されません。ブロックは非同期であるため、すぐには呼び出されません。操作から応答が返されたときに実行されます。JSON リクエスト操作に基づいて画像ビューを設定する場合は、操作の結果が設定された後に (つまり、完了ブロック内で) 行う必要があります。

テーブルビューが操作の結果に依存している場合は、ssURL の値を設定し、ブロック内でテーブル ビューをリロードします。

于 2012-08-05T23:09:42.940 に答える
0

は非同期メソッドであると想定しAFJSONRequestOperation JSONRequestOperationWithRequestています。この場合、2 番目の例では、self.imageView をself.ssURLディスパッチするときに、任意の値に設定しますJSONRequestOperation。最初の例で行ったように、成功した完了ブロックにイメージを設定する必要があります。

于 2012-08-05T23:11:25.467 に答える