0

Rotten Tomatoes APIから値を取得しUILabelていますが、値が既に取得されている場合は常に、カスタムセル内のテキストを更新する必要があります。リロードしてみUITableViewましたが、ループします。

これが私のコードです:

if (ratingTomatoLabel.text == nil)
    {
        NSLog(@"   Nil");

        NSString *stringWithNoSpaces = [movieTitle.text stringByReplacingOccurrencesOfString:@" " withString:@"%20"];
        NSString *rottenTomatoRatingString = [NSString stringWithFormat:@"%@%@%@", @"http://api.rottentomatoes.com/api/public/v1.0/movies.json?apikey=6844abgw34rfjukyyvzbzggz&q=", stringWithNoSpaces, @"&page_limit=1"];
        NSLog(@"   Rotten URL: %@", rottenTomatoRatingString);
        NSURL *rottenUrl = [[NSURL alloc] initWithString:rottenTomatoRatingString];
        NSURLRequest *rottenRequest = [[NSURLRequest alloc] initWithURL:rottenUrl];

        AFJSONRequestOperation *operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:rottenRequest success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) {
            NSLog(@"      3");
            self.testDict = [JSON objectForKey:@"movies"];
        } failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, id JSON) {
            NSLog(@"Request Failed with Error: %@, %@", error, error.userInfo);
        }];

        [operation start];

        NSLog(@"   %@", ratingTomatoLabel.text);
        ratingTomatoLabel.text = @"...";
    }
    else if ([ratingTomatoLabel.text isEqualToString:@""])
    {
        NSLog(@"   isEqualToString");
        // Do nothing
    }
    else
    {
        NSLog(@"   else");
    }

    return tableCell;

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
    NSLog(@"      fetched!");

    if ([ratingTomatoLabel.text isEqualToString:@"..."])
    {
        NSLog(@"      2nd nil");
        NSDictionary *dict = [self.testDict valueForKey:@"ratings"];
        self.criticsScoreString = [NSString stringWithFormat:@"%@", [dict valueForKey:@"critics_score"]];
        self.criticsScoreString = [self.criticsScoreString stringByReplacingOccurrencesOfString:@" " withString:@""];
        self.criticsScoreString = [self.criticsScoreString stringByReplacingOccurrencesOfString:@"(" withString:@""];
        self.criticsScoreString = [self.criticsScoreString stringByReplacingOccurrencesOfString:@")" withString:@""];
        self.criticsScoreString = [NSString stringWithFormat:@"%@%@", self.criticsScoreString, @"%"];

        ratingTomatoLabel.text = self.criticsScoreString;
        NSLog(@"      %@", ratingTomatoLabel.text);
    }
    else
    {
        NSLog(@"      2nd not nil");
        NSLog(@"      %@", ratingTomatoLabel.text);
        // Do nothing
    }
}

テキストに値を設定した後にコードを追加する[self.myTableView reloadData];と、ループが発生します。これを行うための最良の方法は何ですか?ありがとう!

更新:更新されたコードと別のメソッドが含まれています。また、私のratingTomatoLabelは、表示されていないときは常にnilになります。

4

2 に答える 2

0

ジェイトリックス

AFNetworking の呼び出しが非同期で行われている場合は、なんらかの通知を使用して、作業の完了時またはエラーの発生時にメイン スレッド (UI) に通知することを検討してください。

フランク

于 2013-02-05T09:29:52.003 に答える
0

KVO (Key-Value Observing)を使用して、辞書または配列に変更があったことを検出する必要があります。この場合はself.testDict.

この通知を受け取ったら、UITableView の-visibleCellsメソッドを使用して、表示されているセルのみを更新します。他のセルは、を使用してセルがリサイクルされると、明らかに新しい値になります-tableView:cellForRowAtIndexPath:

KVOに必要なもの:ビューのロード/変更時の登録/登録解除、および監視したい変数の設定...

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
    if([keyPath isEqual:@"testDict"])
    {
        NSLog(@"KVO change: %@", change);
        NSArray *visibleCells = [self.myTableView visibleCells];
        for(UITableViewCell *cell in visibleCells)
        {
            if(/*cell matches the one I'm targeting OR just update regardless*/)
                // assign value to UILabel
        }
    }
}

// Call this from -viewDidLoad
- (void)registerAsObserver
{
    [self addObserver:self forKeyPath:@"testDict" options:NSKeyValueObservingOptionNew context:NULL];
}

// Call this from -viewWillDisappear and -viewDidUnload (may not be necessary for -viewDidUnload if already implemented in -viewWillDisappear)
- (void)unregisterAsObserver
{
    [self removeObserver:self forKeyPath:@"testDict"];
}

-reloadRowsAtIndexPaths:withRowAnimation:最後に、変更されたセルを更新するには、メソッドを呼び出して、基礎となるシステムにセルを更新させます。

于 2013-02-05T09:41:41.993 に答える