如何在IOS Objective c中完成循环后运行一行代码?
我是Objective C(IOS)开发的新手,我想知道为什么我的循环下的代码正在执行,即使我的循环还没有完成 这是我的密码:如何在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
-(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#>
});