Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/98.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 迟到的反应_Ios_Objective C_Arrays_Afnetworking 2 - Fatal编程技术网

Ios 迟到的反应

Ios 迟到的反应,ios,objective-c,arrays,afnetworking-2,Ios,Objective C,Arrays,Afnetworking 2,我是AfNetworking新手,我想在运行我的函数后获取数组,但由于它很晚才将数据加载到数组中,所以我总是会崩溃,在它将所有数据加载到数组中之前,有没有办法停止它 -(void) getModelDetails :(NSString*)brandName completionHandler:(void (^)(id array))success { NSString *brand = [brandName stringByAddingPercentEscapesUsingEn

我是AfNetworking新手,我想在运行我的函数后获取数组,但由于它很晚才将数据加载到数组中,所以我总是会崩溃,在它将所有数据加载到数组中之前,有没有办法停止它

   -(void) getModelDetails :(NSString*)brandName  completionHandler:(void (^)(id array))success
{

    NSString *brand = [brandName stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
    [MBProgressHUD showHUDAddedTo:self.view animated:YES];
    AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
    NSString *link = [NSString stringWithFormat:@"http://phablet-fix.com/mob/get-model-details.php?model=%@",brand];
    NSLog(@"%@",link);
    manager.responseSerializer.acceptableContentTypes = [manager.responseSerializer.acceptableContentTypes setByAddingObject:@"text/html"];
    [manager GET:link parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) {
        NSLog(@"JSON: %@", responseObject);
        NSMutableArray *dataArray = [[NSMutableArray alloc] init];
        NSDictionary *returnedDealDict = responseObject ;
        NSArray *returnArray = [returnedDealDict objectForKey:@"modeldetails"];
        for(NSDictionary *dealDict in returnArray)
        {
            model = [[ModelDC alloc] init];
            model.modelID = [[dealDict objectForKey:@"id"] intValue];
            model.model = [dealDict objectForKey:@"model"];
            model.mDeviceBrand = [dealDict objectForKey:@"device_brand"];
            model.mDeviceType = [dealDict objectForKey:@"device_type"];
            model.mProtectionPlanAvilable = [dealDict objectForKey:@"protection_plan_available"];
            model.mSilverPlan1year = [dealDict objectForKey:@"silver_plan_price_1year"];
            model.mSilverPlan2Year = [dealDict objectForKey:@"silver_plan_price_2year"];
            model.mSilverPlan3Year = [dealDict objectForKey:@"silver_plan_price_3year"];
            model.mGoldPlan1year = [dealDict objectForKey:@"gold_plan_price_1year"];
            model.mGoldPlan2year = [dealDict objectForKey:@"gold_plan_price_2year"];
            model.mGoldPlan3Year = [dealDict objectForKey:@"gold_plan_price_3year"];

            [dataArray addObject:model];

        }
        success(dataArray);
        [MBProgressHUD hideHUDForView:self.view animated:YES];
        if (dataArray.count == 0)
        {
            ALERT_VIEW(@"Please check your internet connection.");
            [MBProgressHUD hideHUDForView:self.view animated:YES];
        }
        else
        {
        }

    }
         failure:^(AFHTTPRequestOperation *operation, NSError *error) {
             NSLog(@"Error: %@", error);
             ALERT_VIEW(@"Error occured while loading data.");
             [MBProgressHUD hideHUDForView:self.view animated:YES];
         }];

}
在我的tableview中,数组中没有数据

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath :(NSIndexPath *)indexPath
{
    model = [planArray objectAtIndex:indexPath.row];
    lblselectYourDevice.text = model.selectedModel;
    tblView.hidden = YES;
    modelDetailArray = [[NSMutableArray alloc] init];
    [self getModelDetails:model.selectedModel completionHandler:^(id array)
    {
        modelDetailArray = array;
    }];
    NSLog(@"%d",modelDetailArray.count);
    model = [[ModelDC alloc] init];
    model = [modelDetailArray objectAtIndex:indexPath.row];

}
这是行不通的:

modelDetailArray = [[NSMutableArray alloc] init];
[self getModelDetails:model.selectedModel completionHandler:^(id array)
{
    modelDetailArray = array;
}];
NSLog(@"%d",modelDetailArray.count);
model = [[ModelDC alloc] init];
model = [modelDetailArray objectAtIndex:indexPath.row];
因为您正在创建一个空数组,要求用数据填充该数组,然后立即使用它,而不必等待填充完成(或检查所需的数据是否已实际获得)

改为:

modelDetailArray = nil;

[self getModelDetails:model.selectedModel completionHandler:^(id array) {
    modelDetailArray = array;

    NSLog(@"%d", modelDetailArray.count);
    if (modelDetailArray.count > indexPath.row) {
        model = [modelDetailArray objectAtIndex:indexPath.row];

        // trigger the UI update or next piece of processing here
    } else {
        // deal with the error
    }
}];

请注意,这也不会创建您不打算使用的空对象。

您会遇到什么样的崩溃?您不应该让任何线程等待,您应该在进程完成时触发更新(这就是您的代码已经编写的方式)?显示异常消息和堆栈跟踪,并突出显示发生异常的行。NSRangeException',原因:'***-[\uu NSArrayM objectAtIndex:]:索引1超出空数组的边界'请参见索引处的didselect行我的tableview不为空。.我要做的是在调用didselect行时获取下一个Web服务的参数。。在那之后,它崩溃了。我怎么能把延迟。等待调用完整的Web服务?你不应该这样做。如果需要,请显示活动指示符,但不要让线程等待。我知道,如果(modelDetailArray.count>indepath.row){model=[modelDetailArray objectAtIndex:indepath.row];//在此处触发UI更新或下一步处理,}然后要么您感到困惑,要么您不应该在那里使用
indexPath.row
(这似乎更可能是因为它与web调用返回的数组不同)。