0

更新:ちょっと難しい部分を見つけました...このようなことをするとうまくいきます:

[_friendsArrayInBlock insertObject:@"Bla" atIndex:itemIndex];

しかし、そうではありません:

[_friendsArrayInBlock insertObject:friend atIndex:itemIndex];

カスタム オブジェクトを追加できないのに、NSString を追加できるのはなぜですか? どうしたの

元の部分: 関連するコード部分は次のとおりです。

@implementation ORGFriendsTableViewController
{
    NSMutableArray *_friendsArray;
}

- (void)viewDidLoad
{
    [super viewDidLoad];

    _friendsArray = [NSMutableArray array];
    __block NSMutableArray *_friendsArrayInBlock = _friendsArray;

    [FBRequestConnection startForMyFriendsWithCompletionHandler: ^(FBRequestConnection *connection,
                                                                   id result,
                                                                   NSError *error) {
        FBGraphObject *fbGraphObject = (FBGraphObject *)result;

        NSMutableArray *userArray = fbGraphObject[@"data"];
        for (FBGraphObject *user in userArray) {

            ORGFBUser *friend = [[ORGFBUser alloc] initWithId:user[@"id"] name:user[@"name"] andPhotoURL:@"someurl"];

            NSInteger itemIndex = 0;
            [_friendsArrayInBlock insertObject:friend atIndex:itemIndex];
            [self.tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:[NSIndexPath indexPathForItem:itemIndex inSection:0]] withRowAnimation:UITableViewRowAnimationRight];
        }
    }];
}

問題は次の行に表示されます。

[_friendsArrayInBlock insertObject:friend atIndex:itemIndex];

プログラム受信シグナル「EXC_BAD_ACCESS」

ブロックの概念に関連していると思いますが、それから非スレッドセーフの NSMutableArray を変更しています。

これを修正する方法はありますか?

4

2 に答える 2

3

ブロックは、を使用せずにインスタンス変数にアクセスできます__block(これを参照してください)。したがって、これはうまくいくはずです:

- (void)viewDidLoad
{
    [super viewDidLoad];

    _friendsArray = [NSMutableArray array];

    [FBRequestConnection startForMyFriendsWithCompletionHandler: ^(FBRequestConnection *connection,
                                                                   id result,
                                                                   NSError *error) {
        FBGraphObject *fbGraphObject = (FBGraphObject *)result;

        NSMutableArray *userArray = fbGraphObject[@"data"];
        for (FBGraphObject *user in userArray) {

            ORGFBUser *friend = [[ORGFBUser alloc] initWithId:user[@"id"] name:user[@"name"] andPhotoURL:@"someurl"];

            NSInteger itemIndex = 0;
            [_friendsArray insertObject:friend atIndex:itemIndex];
            [self.tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:[NSIndexPath indexPathForItem:itemIndex inSection:0]] withRowAnimation:UITableViewRowAnimationRight];
        }
    }];
}
于 2012-12-10T16:36:31.570 に答える
-1

これを試して

@implementation ORGFriendsTableViewController
{
    NSMutableArray *_friendsArray;
}

- (void)viewDidLoad
{
    [super viewDidLoad];

    _friendsArray = [NSMutableArray array];
    __block NSMutableArray *_friendsArrayInBlock = _friendsArray;

    [FBRequestConnection startForMyFriendsWithCompletionHandler: ^(FBRequestConnection *connection,
                                                                   id result,
                                                                   NSError *error) {
        FBGraphObject *fbGraphObject = (FBGraphObject *)result;

        NSMutableArray *userArray = fbGraphObject[@"data"];
        for (FBGraphObject *user in userArray) {

            ORGFBUser *friend = [[ORGFBUser alloc] initWithId:user[@"id"] name:user[@"name"] andPhotoURL:@"someurl"];

            [_friendsArrayInBlock addObject:friend];
            [self.tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:[NSIndexPath indexPathForRow:_friendsArrayInBlock.count-1 inSection:0]] withRowAnimation:UITableViewRowAnimationRight];
        }
    }];
    [self.tableView reloadData];
}
于 2012-12-10T16:33:24.870 に答える