- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我正在 dispatch_sync()
在主队列中插入一个 block 。在此 block 中,最终调用了 executeFetchRequest:error:
。有时,这会导致死锁。
这是线程 1,它显示了在主线程上调用的 block ,然后调用了 executeFetchRequest:error:
#0 0x981f3876 in __psynch_mutexwait ()
#1 0x97a016af in pthread_mutex_lock ()
#2 0x0135be32 in -[_PFLock lock] ()
#3 0x0135be0a in -[NSPersistentStoreCoordinator lock] ()
#4 0x01371d1c in -[NSManagedObjectContext(_NSInternalAdditions) lockObjectStore] ()
#5 0x013702c0 in -[NSManagedObjectContext executeFetchRequest:error:] ()
#6 0x0000a701 in -[NSManagedObjectContext(Convenience) fetchObjectsForEntityName:onlyIDs:withPredicate:] at /Users/mike/Dropbox/src/Tracky-iPhone/Tracky/Tracky/NSManagedObjectContext(Convenience).m:50
#7 0x00065270 in +[NSManagedObject(ContextAdditions) contextForID:managedObjectContext:] at /Users/mike/Dropbox/src/Tracky-iPhone/Tracky/Tracky/NSManagedObject+ContextAdditions.m:40
#8 0x0006597e in __85+[NSManagedObject(ContextAdditions) createContextIfNeededForID:managedObjectContext:]_block_invoke_0 at /Users/mike/Dropbox/src/Tracky-iPhone/Tracky/Tracky/NSManagedObject+ContextAdditions.m:55
#9 0x00065aad in __85+[NSManagedObject(ContextAdditions) createContextIfNeededForID:managedObjectContext:]_block_invoke_050 at /Users/mike/Dropbox/src/Tracky-iPhone/Tracky/Tracky/NSManagedObject+ContextAdditions.m:64
#10 0x023cf8d9 in _dispatch_barrier_sync_f_slow_invoke ()
#11 0x023d0509 in _dispatch_main_queue_callback_4CF ()
#12 0x01ae9803 in __CFRunLoopRun ()
#13 0x01ae8d84 in CFRunLoopRunSpecific ()
#14 0x01ae8c9b in CFRunLoopRunInMode ()
#15 0x019b47d8 in GSEventRunModal ()
#16 0x019b488a in GSEventRun ()
#17 0x004ba626 in UIApplicationMain ()
我可以看到 executeFetchRequest:error:
正在阻止 NSPersistentStoreCoordinator
的锁,但我不知道目前谁锁定了它。
原始的 dispatch_sync()
是从不同的线程发生的,这里是为了以防它很重要:
Thread 18, Queue : (null)
#0 0x981f1c5e in semaphore_wait_trap ()
#1 0x023d1bda in _dispatch_thread_semaphore_wait ()
#2 0x023d0cb2 in _dispatch_barrier_sync_f_slow ()
#3 0x023d0e0f in dispatch_barrier_sync_f ()
#4 0x023d0f4c in _dispatch_sync_slow ()
#5 0x0006563a in +[NSManagedObject(ContextAdditions) createContextIfNeededForID:managedObjectContext:] at /Users/mike/Dropbox/src/Tracky-iPhone/Tracky/Tracky/NSManagedObject+ContextAdditions.m:63
#6 0x0006e2ee in __109-[ItemFetcher createOrConfigureObjectWithDescriptor:withContext:jsonObjectIDKey:modelObjectIDKey:entityName:]_block_invoke_0 at /Users/mike/Dropbox/src/Tracky-iPhone/Tracky/Tracky/ItemFetcher.m:78
#7 0x023ce330 in _dispatch_call_block_and_release ()
#8 0x023cff0c in _dispatch_queue_drain ()
#9 0x023cfcb4 in _dispatch_queue_invoke ()
#10 0x023cf402 in _dispatch_worker_thread2 ()
#11 0x97a04b24 in _pthread_wqthread ()
这是原始调度的代码:
+ (Context *) createContextIfNeededForID: (NSString *) contextID managedObjectContext:(NSManagedObjectContext *) moc
{
// See if this context is in the main MOC. This call needs to happen synchronously on the main queue, if we're
// not on the main queue
Context * (^contextFromMainMOCBlock)(void) =
^ `Context` * {
// We are guaranteed to be in the main here; look at how this block is invoked.
return [self contextForID:contextID managedObjectContext:[UIApplication trackyAppDelegate].managedObjectContext] ;
} ;
__block Context *contextFromMainMOC = nil ;
if( [UIApplication trackyAppDelegate].managedObjectContext == moc )
contextFromMainMOC = contextFromMainMOCBlock() ;
else
dispatch_sync(dispatch_get_main_queue(), ^{
contextFromMainMOC = contextFromMainMOCBlock() ; // <-- here
}) ;
…
contextForID:contextID managedObjectContext:
在调用 executeFetchRequest:error:
之前,实际上不会对核心数据做任何事情。
更新
这是堆栈跟踪的其余部分。据我所知,他们没有做任何有趣的事情,尽管我可能是错的。
Thread 3, Queue : (null)
#0 0x981f490a in kevent ()
#1 0x023d0372 in _dispatch_mgr_invoke ()
#2 0x023cebe1 in _dispatch_mgr_thread ()
Thread 5 WebThread, Queue : (null)
#0 0x981f1c22 in mach_msg_trap ()
#1 0x981f11f6 in mach_msg ()
#2 0x01b8610a in __CFRunLoopServiceMachPort ()
#3 0x01ae95d5 in __CFRunLoopRun ()
#4 0x01ae8d84 in CFRunLoopRunSpecific ()
#5 0x01ae8c9b in CFRunLoopRunInMode ()
#6 0x04776420 in _ZL12RunWebThreadPv ()
#7 0x97a02ed9 in _pthread_start ()
Thread 6 com.apple.NSURLConnectionLoader, Queue : (null)
#0 0x981f1c22 in mach_msg_trap ()
#1 0x981f11f6 in mach_msg ()
#2 0x01b8610a in __CFRunLoopServiceMachPort ()
#3 0x01ae95d5 in __CFRunLoopRun ()
#4 0x01ae8d84 in CFRunLoopRunSpecific ()
#5 0x01ae8c9b in CFRunLoopRunInMode ()
#6 0x00ebae30 in +[NSURLConnection(Loader) _resourceLoadLoop:] ()
#7 0x00dcc4d6 in -[NSThread main] ()
#8 0x00dcc447 in __NSThread__main__ ()
#9 0x97a02ed9 in _pthread_start ()
Thread 10 com.apple.CFSocket.private, Queue : (null)
#0 0x981f3b42 in select$DARWIN_EXTSN ()
#1 0x01b1a7cb in __CFSocketManager ()
#2 0x97a02ed9 in _pthread_start ()
这里是 contextID:managedObjectContext:
,这是在 dispatch_sync()
中调用的方法:
+ (Context *) contextForID: (NSString *) contextID managedObjectContext:(NSManagedObjectContext *) moc
{
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"cid == %@", contextID] ;
NSSet *contexts = [moc fetchObjectsForEntityName:@"Context" onlyIDs:NO withPredicate:predicate] ;
// Integrity check
NSAssert1(contexts.count < 2, @"More than one context with the same CID exists: %@" , contexts) ;
return [contexts anyObject] ;
}
fetchObjectsForEntityName:onlyIDs:withPredicate:
看起来像这样:
- (NSSet *)fetchObjectsForEntityName:(NSString *)newEntityName onlyIDs: (BOOL) onlyIDs
withPredicate:(id)stringOrPredicate, ...
{
NSEntityDescription *entity = [NSEntityDescription
entityForName:newEntityName inManagedObjectContext:self];
NSAssert1( entity != nil , @"entity not found for \"%@\"" , newEntityName ) ;
NSFetchRequest *request = [[NSFetchRequest alloc] init];
[request setEntity:entity];
[request setIncludesPropertyValues:!onlyIDs] ;
if (stringOrPredicate)
{
NSPredicate *predicate;
if ([stringOrPredicate isKindOfClass:[NSString class]])
{
va_list variadicArguments;
va_start(variadicArguments, stringOrPredicate);
predicate = [NSPredicate predicateWithFormat:stringOrPredicate
arguments:variadicArguments];
va_end(variadicArguments);
}
else
{
NSAssert2([stringOrPredicate isKindOfClass:[NSPredicate class]],
@"Second parameter passed to %s is of unexpected class %@",
sel_getName(_cmd), NSStringFromClass(stringOrPredicate));
predicate = (NSPredicate *)stringOrPredicate;
}
[request setPredicate:predicate];
}
NSError *error = nil;
NSArray *results ;
@try {
results = [self executeFetchRequest:request error:&error];
}
@catch (NSException *exception) {
NSLog(@"Exception caught: %@" , exception) ;
}
if (error != nil)
{
[NSException raise:NSGenericException format:@"%@",[error description]];
}
return [NSSet setWithArray:results];
}
最佳答案
为了提供更多帮助,您需要在堆栈跟踪中显示所有方法的代码以及行号。这样,它就可以关联起来。
另外,看起来你有很多线程。我认为您将不得不检查其他人以了解发生了什么。
调用同步操作时必须非常小心,尤其是当它可能被其他同步操作调用时。
关于iphone - 主队列上的 dispatch_sync 和 executeFetchRequest 之间的死锁 :error:,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10257462/
我需要修复 getLineNumberFor 方法,以便如果 lastName 的第一个字符位于 A 和 M 之间,则返回 1;如果它位于 N 和 Z 之间,则返回 2。 在我看来听起来很简单,但我不
您好,感谢您的帮助!我有这个: 0 我必须在每次点击后增加“pinli
Javascript 中是否有一种方法可以在不使用 if 语句的情况下通过 switch case 结构将一个整数与另一个整数进行比较? 例如。 switch(integer) { case
我有一列是“日期”类型的。如何在自定义选项中使用“之间”选项? 最佳答案 请注意,您有2个盒子。 between(在SQL中)包含所有内容,因此将框1设置为:DATE >= startdate,将框2
我有一个表,其中包含年、月和一些数字列 Year Month Total 2011 10 100 2011 11 150 2011 12 100 20
这个问题已经有答案了: Extract a substring between double quotes with regular expression in Java (2 个回答) how to
我有一个带有类别的边栏。正如你在这里看到的:http://kees.een-site-bouwen.nl/ url 中类别的 ID。带有 uri 段(3)当您单击其中一个类别时,例如网页设计。显示了一
这个问题在这里已经有了答案: My regex is matching too much. How do I make it stop? [duplicate] (5 个答案) 关闭 4 年前。 我
我很不会写正则表达式。 我正在尝试获取括号“()”之间的值。像下面这样的东西...... $a = "POLYGON((1 1,2 2,3 3,1 1))"; preg_match_all("/\((
我必须添加一个叠加层 (ImageView),以便它稍微移动到包含布局的左边界的左侧。 执行此操作的最佳方法是什么? 尝试了一些简单的方法,比如将 ImageView 放在布局中并使用负边距 andr
Rx 中是否有一些扩展方法来完成下面的场景? 我有一个开始泵送的值(绿色圆圈)和其他停止泵送的值(簧片圆圈),蓝色圆圈应该是预期值,我不希望这个命令被取消并重新创建(即“TakeUntil”和“Ski
我有一个看起来像这样的数据框(Dataframe X): id number found 1 5225 NA 2 2222 NA 3 3121 NA 我有另一个看起来
所以,我正在尝试制作正则表达式,它将解析存储在对象中的所有全局函数声明,例如,像这样 const a = () => {} 我做了这样的事情: /(?:const|let|var)\s*([A-z0-
我正在尝试从 Intellivision 重新创建 Astro-Smash,我想让桶保持在两个 Angular 之间。我只是想不出在哪里以及如何让这个东西停留在两者之间。 我已经以各种方式交换了函数,
到处检查但找不到答案。 我有这个页面,我使用 INNER JOIN 将两个表连接在一起,获取它们的值并显示它们。我有这个表格,用来获取变量(例如开始日期、结束日期和卡号),这些变量将作为从表中调用值的
我陷入了两个不同的问题/错误之间,无法想出一个合适的解决方案。任何帮助将不胜感激 上下文、FFI 和调用大量 C 函数,并将 C 类型包装在 rust 结构中。 第一个问题是ICE: this pat
我在 MySQL 中有一个用户列表,在订阅时,时间戳是使用 CURRENT_TIMESTAMP 在数据库中设置的。 现在我想从此表中选择订阅日期介于第 X 天和第 Y 天之间的表我尝试了几个查询,但不
我的输入是开始日期和结束日期。我想检查它是在 12 月 1 日到 3 月 31 日之间。(年份可以更改,并且只有在此期间内或之外的日期)。 到目前为止,我还没有找到任何关于 Joda-time 的解决
我正在努力了解线程与 CPU 使用率的关系。有很多关于线程与多处理的讨论(一个很好的概述是 this answer )所以我决定通过在运行 Windows 10、Python 3.4 的 8 CPU
我正在尝试编写 PHP 代码来循环遍历数组以创建 HTML 表格。我一直在尝试做类似的事情: fetchAll(PDO::FETCH_ASSOC); ?>
我是一名优秀的程序员,十分优秀!