iOS方法在已经运行时被调用时崩溃(使用NSOperationQueue)

时间:2014-05-30 11:27:51

标签: ios objective-c uitableview nsoperation nsoperationqueue

我有UIViewController包含UITableView,当我调用方法“requireObjects”时,最后填充数组以配置表。我声明cellForRowAtIndexPath方法正常工作,并根据[_arrID count]将一些单元格出列。

每个填充的数组都与所有其他数组具有匹配的索引。例如,arrID[5] = 453对应arrNames[5] = "Jean",对应arrStyle[5] = "Angry",对应arrLocation[5] = "New York",对应arrProfileSnaps[5] = jean.png

例如,这5个数组组成了tableView中的第五个单元格。方法“requireObjects”成功,表格构建正确。当我在运行时调用此方法时会出现问题。我希望单击按钮时该方法停止并重复。或绝望的时候,方法结束执行并在我点击按钮时重复也是好的。但不幸的是我的应用程序崩溃了。代码如下:

- (void)requireObjects{

    @try {
        //threadsQueue is a NSOperationQueue allocated and initialized in viewDidLoad method
        [threadsQueue cancelAllOperations];
        [threadsQueue waitUntilAllOperationsAreFinished];



                [_arrID removeAllObjects];
                [_arrNames removeAllObjects];
                [_arrStyle removeAllObjects];
                [_arrLocation removeAllObjects];
                [_arrProfileSnaps removeAllObjects];

            _arrNames = [[NSMutableArray alloc] init];
            _arrStyle = [[NSMutableArray alloc] init];
            _arrLocation = [[NSMutableArray alloc] init];
            _arrProfileSnaps = [[NSMutableArray alloc] init];

        [threadsQueue addOperation:[NSBlockOperation blockOperationWithBlock: ^{

            [[NSOperationQueue mainQueue] addOperationWithBlock:^{

                CGRect activityFrame = CGRectMake(self.view.center.x, self.view.center.y, 0.0, 0.0);

                _activityIndicator = [[UIActivityIndicatorView alloc] initWithFrame:activityFrame];

                [[self.view superview] addSubview:_activityIndicator];

                _activityIndicator.activityIndicatorViewStyle = UIActivityIndicatorViewStyleWhiteLarge;
                _activityIndicator.color = [UIColor whiteColor];
                [_activityIndicator startAnimating];
                [_tableView reloadData];
            }];


        _arrID = [[NSMutableArray alloc] initWithArray:[NSArray arrayWithObjects:@"0",@"1",@"2",@"3",@"4",@"5",@"6",@"7",@"8",@"9", nil]];

            for (int i = 0; i < [_arrID count]; i++) {
                [_arrStyle addObject:@“..”];
                [_arrNames addObject:@".."];
                [_arrLocation addObject:@“..”];
                [_arrProfileSnaps addObject:[UIImage imageNamed:@"blank"]];
            }

            [[NSOperationQueue mainQueue] addOperationWithBlock: ^{

                [self.tableView reloadData];
                [_activityIndicator stopAnimating];
            }];
        }]];
    }

    @catch (NSException *exception) {
        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"An exception has occurred" message:[NSString stringWithFormat:@"%@",exception] delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:nil, nil];
        [alert show];
    }
}

应用程序在我执行[_arrNames insertObject:...的位置的for循环的一次迭代中崩溃。错误:

  

由于未捕获的异常'NSRangeException'而终止应用程序,原因:   ' * - [__ NSArrayM objectAtIndex:]:索引0超出范围为空   阵'

奇怪的是,无论何时我调用它,该方法都会成功,但只有当它在已经运行时调用它时才会崩溃!

1 个答案:

答案 0 :(得分:1)

您正在操作队列上调用[_arrID removeAllObjects];_arrNames等相同,这可能会同时运行,具体取决于调用哪个线程requireObjects:而不一定是线程安全。尝试在创建块之前初始化和设置对象,并使用变量传递而不是通过存储在对象中的变量进行通信。