Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/120.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_Sqlite_Nsoperation_Fmdb - Fatal编程技术网

Ios 如何阻止选择器一次被多次访问?

Ios 如何阻止选择器一次被多次访问?,ios,objective-c,sqlite,nsoperation,fmdb,Ios,Objective C,Sqlite,Nsoperation,Fmdb,我有一个选择器,可以更新我的sqlite(FMDB框架)数据库fillTopXTraps。 当我调用选择器更新两个单独的数据库时,它在“DataBase”类中失败(很快->“db”)。 我有一个错误: 该数据库目前正在使用中 多次 我试图调用fillTopXTraps使用: [databaseQueue addOperation:invokeOperation]; [databaseQueue waitUntilAllOperationsAreFinished]; 我有一个错误“数据库已锁定”

我有一个选择器,可以更新我的sqlite(FMDB框架)数据库
fillTopXTraps
。 当我调用选择器更新两个单独的数据库时,它在“DataBase”类中失败(很快->“db”)。 我有一个错误:

该数据库目前正在使用中

多次

我试图调用
fillTopXTraps
使用:

[databaseQueue addOperation:invokeOperation];
[databaseQueue waitUntilAllOperationsAreFinished];
我有一个错误“数据库已锁定”,并且:

[NSOperationQueue addOperations:waitUntilFinished:]:1(共1个) 操作已完成、正在执行或已在队列中,因此无法执行 排队

我尝试使用FMDatabaseQueue,但仍然出现错误“数据库已锁定”和“当前正在使用”

如何确保
fillTopXTraps
在其已被处理且知道等待完成后继续的情况下不会继续。
或者问题可能是从多线程调用的数据库,显然,我如何修复它?

如果通过串行队列发送更新,它们将以FIFO顺序运行:

-(void)serialize:(void (^)(void))task
{
    static dispatch_queue_t serialQueue = NULL;
    if (!serialQueue) { 
        serialQueue = dispatch_queue_create("com.your.serial.queue", DISPATCH_QUEUE_SERIAL);
    }
    dispatch_async(serialQueue, ^{
        dispatch_sync(dispatch_get_main_queue(), task);
    });
}

[self serialize:^{
    // database update
}];

请注意,任务是异步运行的,但一旦执行,它就会同步到主队列。我希望这就是您想要的。

我仍在使用“当前正在使用”。另一个问题是从数据库调用是在if语句中,我不能用块包装它。初始化串行队列不是线程安全的。您最好使用dispatch_一次。您是否使用多个FMDatabaseQueues?每个数据库只能使用一个。当我需要返回一些值时,我使用一个FMDatabaseQueue来更新/插入/删除,使用FMDatabase来选择语句。