如何在IOS Objective c中完成循环后运行一行代码?

如何在IOS Objective c中完成循环后运行一行代码?,ios,objective-c,loops,Ios,Objective C,Loops,我是Objective C(IOS)开发的新手,我想知道为什么我的循环下的代码正在执行,即使我的循环还没有完成 这是我的密码: -(void)update_tbl_selectItem_data{ db = [[DbHandler alloc] init]; ComputeProductPrice *computeProductPrice = [[ComputeProductPrice alloc]init]; [computeProductPrice ProductPric

我是Objective C(IOS)开发的新手,我想知道为什么我的循环下的代码正在执行,即使我的循环还没有完成

这是我的密码:

-(void)update_tbl_selectItem_data{


db = [[DbHandler alloc] init];
    ComputeProductPrice *computeProductPrice = [[ComputeProductPrice alloc]init];
    [computeProductPrice ProductPriceComputation];


 NSLog(@"count: %i", [g_allItemId count]);
for (int i = 0; i < [g_allItemId count]; i++) {

    NSLog(@"itemID: %@", [g_allItemId objectAtIndex:i]);
    NSString *l_uomqty = [[DbHandler database] getUomQty:[g_allItemId objectAtIndex:i]];

    [db insertDataIn_tbl_selectItem_data:g_employeeid ProdId:[g_allItemId objectAtIndex:i] ProdName:[g_allDesc objectAtIndex:i] GenName:[g_allGenName objectAtIndex:i] ComputeType:[g_allType objectAtIndex:i] UOM:[g_allUOM objectAtIndex:i] ListPrice:[g_allPrice objectAtIndex:i] UOMQty:l_uomqty];


}
[db updateDatabaseHasChanges:g_employeeid];


[[NSNotificationCenter defaultCenter] postNotificationName:@"performSegueSoldToToSelectItem" object:nil];
}
我希望代码行在循环后执行。请帮帮我,我受不了了

编辑

以下是数据库方法:

-(void)insertDataIn_tbl_selectItem_data: (NSString *)empID ProdId: (NSString *)prodId ProdName: (NSString *)prodName  GenName: (NSString *)genName ComputeType: (NSString *)computeType UOM: (NSString *)uom ListPrice: (NSString *)listPrice UOMQty: (NSString *)uomqty{



//    NSString *query = [NSString stringWithFormat:@"insert into tbl_selectItem_data (femployeeid,fproductid,fname,fgeneric_name,fcompute_type,fuom,flist_price,fuomqty) values ('%@','%@', '%@', '%@', '%@', '%@', '%@', '%@')", empID, prodId, prodName, genName, computeType, uom, listPrice, uomqty];

const char *query = "insert into tbl_selectItem_data (femployeeid,fproductid,fname,fgeneric_name,fcompute_type,fuom,flist_price,fuomqty) values (?,?, ?, ?, ?, ?, ?, ?)";


sqlite3_stmt *stmt;
//char *err;
if (sqlite3_open([l_SqliteDb UTF8String], &(_database)) == SQLITE_OK) {
    if (sqlite3_prepare_v2(_database, query, -1, &stmt, nil) == SQLITE_OK) {

        sqlite3_bind_text(stmt, 1, [empID UTF8String], -1, NULL);
        sqlite3_bind_text(stmt, 2, [prodId UTF8String], -1, NULL);
        sqlite3_bind_text(stmt, 3, [prodName UTF8String], -1, NULL);
        sqlite3_bind_text(stmt, 4, [genName UTF8String], -1, NULL);
        sqlite3_bind_text(stmt, 5, [computeType UTF8String], -1, NULL);
        sqlite3_bind_text(stmt, 6, [uom UTF8String], -1, NULL);
        sqlite3_bind_text(stmt, 7, [listPrice UTF8String], -1, NULL);
        sqlite3_bind_text(stmt, 8, [uomqty UTF8String], -1, NULL);

        if(sqlite3_step(stmt) == SQLITE_DONE){
            NSLog(@"Insert Successful");
            sqlite3_finalize(stmt);
            sqlite3_close(_database);
        }else{
            NSLog(@"insertDataIn_tbl_selectItem_data error: %s", sqlite3_errmsg(_database));
        }

        sqlite3_finalize(stmt);
    }


}

sqlite3_close(_database);

}


-(void)updateDatabaseHasChanges: (NSString *)empId{
NSString *query = [NSString stringWithFormat:@"UPDATE tbl_employee_has_changes SET has_changes=0 WHERE femployeeid='%@'", empId];
sqlite3_stmt *l_statement;

if (sqlite3_open([l_SqliteDb UTF8String], &(_database)) == SQLITE_OK) {
    if (sqlite3_prepare_v2(_database, [query UTF8String], -1, &l_statement, nil) == SQLITE_OK) {
        if (sqlite3_step(l_statement) == SQLITE_DONE) {
            NSLog(@"Update Successful");
            sqlite3_finalize(l_statement);
            sqlite3_close(_database);
        }else{
            NSLog(@"updateDatabaseHasChanges error: %s", sqlite3_errmsg(_database));
            sqlite3_finalize(l_statement);
            sqlite3_close(_database);
        }

    }
}
sqlite3_close(_database);
}

我认为问题可能是db操作需要一些时间才能完成,并且for循环之后的代码在它之前执行。更好的方法是使用
insertDataIn\u tbl\u selectItem\u data
中的回调方法来执行剩余的任务

[db updateDatabaseHasChanges:g_employeeid];


[[NSNotificationCenter defaultCenter] postNotificationName:@"performSegueSoldToToSelectItem" object:nil];
澄清:

循环必须在下面的调用之前完成

但是,您正在调用的方法可能是异步的,这意味着它们在后台运行。如果是这种情况,它们可能需要一段时间才能完成,您需要某种回调或完成方法来告诉您所做的数据库调用何时完成


为了了解发生了什么,我们需要更多关于您在循环中调用的数据库方法的信息。

在当前执行之后,使用以下代码在主线程中执行方法

double delayInSeconds = 0.01;
    dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC));
    dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
        <#code to be executed on the main queue after delay#>
    });
double delayUnseconds=0.01;
dispatch_time_t popTime=dispatch_time(dispatch_time_NOW,(int64_t)(DelayUnseconds*NSEC_PER_SEC));
调度\u after(popTime,调度\u get\u main\u queue(),^(void){
});

这不会发生。尝试将nslog放在for循环之后,并检查其是否记录在for循环日志的末尾或中间。当您调用insertData方法时,可能有什么东西正在调用UpdateDatabase方法。我很高兴看到我的回答(来自您的其他问题)帮助您插入sql。。。但是如果你不回答,没有人会在将来帮助你:(@TonyMkenu让我的问题变得简单。我有我的方法(1)在里面运行一个循环,然后我有另一个方法(2)在上面调用方法(1),在调用方法(1)的时候它里面有一个NSlog。但我的问题是我想在方法(2)之上完成循环(方法1)后运行NSLog。我已经添加了我的数据库方法。请检查编辑的问题Duncan是否正确,因为for循环的工作方式是正确的,不可能在完成前运行下面的代码。您的日志说明了什么?所有
NSLog(@“itemID:%@),[g_allItemId objectAtIndex:i]);
应该在执行以下任一命令之前打印,对吗?你能提出解决方案吗?我不知道该怎么办。你能举个回调的例子吗
double delayInSeconds = 0.01;
    dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC));
    dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
        <#code to be executed on the main queue after delay#>
    });