

動的にUITableView対して行を追加しようとしているのですが、  
\- 追加（表示）される: viewDidLoad中のアイテム追加  
\- 追加（表示）されない: AFNetworkingの呼び出し完了後のアイテム追加  
という状態です。

tableViewインスタンスに対してinsertRowsAtIndexPathsするときは  
mainスレッドにする、といったよくハマりがちなポイントは抑えているつもりなのですが、  
2つ目のアイテムが追加されない理由がよくわかっておりません。

どなたかヒントを頂けると幸いです。

=====  
ViewController.h

[code]

    #import 
    
    @interface ViewController : UIViewController
    
    @end
    
[/code]

ViewController.m

[code]

    #import "ViewController.h"
    #import 
    
    @interface ViewController ()
    @property IBOutlet UITableView* tableView;
    @property NSMutableArray*       cells;
    @end
    
    @implementation ViewController{
    };
    
    static NSString *CellIdentifier = @"tableCell";
    
    - (void)viewDidLoad
    {
        [super viewDidLoad];
        NSLog(@"viewDidLoad");
    
        self.cells = [[NSMutableArray alloc] init];
        NSString* url = @"https://yahoo.co.jp";
        [self.cells addObject:url];
        NSIndexPath *path = [NSIndexPath indexPathForRow:0 inSection:0];
        [self.tableView beginUpdates];
        [self.tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:path] withRowAnimation:UITableViewRowAnimationTop];
        [self.tableView endUpdates];
    
        [self refresh];
    }
    
    - (void)refresh
    {
        NSString* url = @"https://httpbin.org/get";
    
        AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
        manager.responseSerializer.acceptableContentTypes = [NSSet setWithObject:@"application/json"];
    
        [manager GET:url parameters:nil progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
            dispatch_async(dispatch_get_main_queue(), ^{
                NSIndexPath *path = [NSIndexPath indexPathForRow:0 inSection:0];
                [self.cells addObject:url];
                [self.tableView beginUpdates];
                [self.tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:path] withRowAnimation:UITableViewRowAnimationTop];
                [self.tableView endUpdates];
                NSLog(@"%@", url);
                [self.tableView reloadData];
            });
            NSLog(@"end : refresh");
        } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
            NSLog(@"failed 1 - error = %@", error.localizedDescription);
        }];
    }
    
    - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
    {
        return 1;
    }
    
    - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
    {
        return self.cells.count;
    }
    
    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
    {
        NSLog(@"cellForRowAtIndexPath");
    
        UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    
        NSInteger row = indexPath.row;
    
        UILabel *label = [cell viewWithTag:4];
        label.text = self.cells[row];
        NSLog(@"%ld : %@", self.cells.count, label.text);
    
        return cell;
    }
    
    @end
    
[/code]

[code]

    2017-02-03 06:44:25.242353 test[11678:2443409] viewDidLoad
    2017-02-03 06:44:25.330775 test[11678:2443409] cellForRowAtIndexPath
    2017-02-03 06:44:25.334614 test[11678:2443409] 1 : https://yahoo.co.jp
    2017-02-03 06:44:26.134155 test[11678:2443409] end : refresh
    2017-02-03 06:44:26.134275 test[11678:2443409] https://httpbin.org/get
    
[/code]


CC BY-SA 3.0
2017-02-02T05:12:46.103
32324
2018-08-14T13:01:27.967
2017-02-02T22:20:04.800
20487
20487
question
ios objective-c
UITableViewの動的更新


メソッド`refresh`から抜粋します。

[code]

    NSIndexPath *path = [NSIndexPath indexPathForRow:0 inSection:0];
    [self.cells addObject:url];
    [self.tableView beginUpdates];
    [self.tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:path] withRowAnimation:UITableViewRowAnimationTop];
    [self.tableView endUpdates];
    
[/code]

`NSMutableArray`の`cells`には、配列末尾に`url`を追加しています。しかし、`tableView`の行に対しては、先頭行に挿入しています。データと表示が一致していません。  
しかしながら、このコードのままでも、奇妙な挙動をします（「`https://httpbin.org/get`」出なく、「`https://yahoo.co.jp`」が追加になる）が、テーブルの行は2行になります（なるはずです）。

* * *

`NSLog`の出力（なんだろうと決めつけて、話を進めますが）を調べると、

  1. `AFHTTPSessionManager`は、機能している。
  2. `dispatch_async(dispatch_get_main_queue()`のブロック要素の中も実行されている。
  3. テーブルの行の更新は1回だけ。すなわち行の追加は行われていない。

以上のことがわかります。2.と3.は矛盾していますが、なぜ矛盾するのかはわかりません。  
ご提示のコードは、必要十分なものではなく、必要な行が省略されています。質問の内容に直接関係ないコードを書いてもらっても困りますが、関係のある行まで省略されては、どう対応していいか、途方にくれるだけです。

[code]

    #import "ViewController.h"
    #import 
    
[/code]

一例を挙げると、この2行目は何ですか？ということです。


CC BY-SA 3.0
2017-02-03T00:14:33.770
32354
2017-02-03T00:14:33.770
18540
32324
answer