dispatch_async *串行队列上的神秘EXC_BAD_ACCESS *

时间:2016-02-12 00:55:33

标签: sqlite exc-bad-access dispatch-async

我有一个基于位置的应用程序,每1秒获取一次位置,并一次将一批位置保存到CoreData DB,以免使位置数组太大。但是,由于某种原因,即使我在SERIAL QUEUE上使用dispatch_async,它也会因EXC_BAD_ACCESS而崩溃:

创建了一个全局串行自定义队列,如下所示:

var MyCustomQueue : dispatch_queue_t = 
dispatch_queue_create("uniqueID.for.custom.queue", DISPATCH_QUEUE_SERIAL);
在didUpdateToLocation协议函数中,如果批量大小超过预设数量,我有一些代码可以将最新一批CLLocation项目保存到磁盘上:

if(myLocations.count == MAX_LOCATIONS_BUFFER)
{
    dispatch_async(MyCustomQueue)
    {

        for myLocation in self.myLocations
        {
        // the next line is where it crashes with EXC_BAD_ACCESS
            newLocation = NSEntityDescription.insertNewObjectForEntityForName(locationEntityName, inManagedObjectContext: context as NSManagedObjectContext) ;
            newLocation.setValue(..)
            // all the code to set the attributes
        }

        appDelegate.saveContext();

        dispatch_async(dispatch_get_main_queue()) {
        // once the latest batch is saved, empty the in-memory array
            self.myLocations = [];
        }

    }
}

神秘之处在于,即使你使用dispatch_async(它只是让执行与MAIN线程同时执行,也不会触及SQLite数据)?

备注:

  • 崩溃发生在随机时间......有时它会在0.5英里后崩溃,其他时间会在2英里后崩溃等等。
  • 如果我只是取出任何dispatch_async代码(只是在主线程上按顺序执行所有操作),就没有问题。

1 个答案:

答案 0 :(得分:0)

您可以查看此链接。您的问题可能是因为当您尝试将项目插入其中时没有MOC。

Core Data : inserting Objects crashed in global queue [ARC - iPhone simulator 6.1]