- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我刚刚“解决”了似乎是死锁或同步的问题:
[NSThread sleepForTimeInterval:0.1];
在将 IPOD 库中的 MPMediaItem(音乐/图像)属性引用附加到对象实例的应用程序中,这些对象通过 CoreData 回存。我在这里的兴趣是准确了解正在发生的事情以及这种情况下的最佳做法是什么。开始了:
每次复制的方法如下:
用户创建了一个新项目。
doc = [[UIManagedDocument alloc] initWithFileURL:docURL];
if (![[NSFileManager defaultManager] fileExistsAtPath:[docURL path]]) {
[doc saveToURL:docURL forSaveOperation:UIDocumentSaveForCreating completionHandler:^(BOOL success) {
if (success) {
completionBlock(doc);
}
else {
DLog(@"Failed document creation: %@", doc.localizedName);
}
}];
稍后 managedObjectContext 用于关联对象实例并混合 CoreData 模型
TheProject *theProject = [TheProject projectWithInfo:theProjectInfo
inManagedObjectContext:doc.managedObjectContext];
用户稍后创建“CustomAction”对象,向其添加“ChElement”并将“MusicElement”与 ChElement 相关联。 (这些是 CoreData 模型对象的化名)。 MusicElement 是通过 IPOD 库添加的。
#define PLAYER [MPMusicPlayerController iPodMusicPlayer]
用户保存此项目,然后切换到一个现有项目,该项目已经创建了一个 CustomAction 对象,其中包含一个 ChElement 和一个 MusicElement。
用户从 tableView 中选择 ChElement 并导航到 detailView。当离开 ChElementTVC(类似于 Apple 文档中的 CoreData TableViewController 类的子类)时,这是必需的:
- (void)viewWillDisappear:(BOOL)animated
{
[super viewWillDisappear:animated];
self.fetchedResultsController.delegate = nil;
}
在详细 View 中,用户更改 ChElement 对象的属性并保存项目。 detailView 调用它的委托(delegate) (ChElementTVC) 来进行保存。保存到保存 NSManagedObject 的 UIManagedDocument 实例。
#define SAVEDOC(__DOC__) [ProjectDocumentHelper saveProjectDocument:__DOC__]
// Delegate
- (void)chAddElementDetailViewController:(ChDetailViewController *)sender didPressSaveButton:(NSString *)message
{
SAVEDOC(THE_CURRENT_PROJECT_DOCUMENT);
[self.navigationController popViewControllerAnimated:YES];
}
// Helper Class
+ (void)saveProjectDocument:(UIManagedDocument *)targetDocument
{
NSManagedObjectContext *moc = targetDocument.managedObjectContext;
[moc performBlockAndWait:^{
DLog(@" Process Pending Changes before saving : %@, Context = %@", targetDocument.description, moc);
[moc processPendingChanges];
[targetDocument saveToURL:targetDocument.fileURL forSaveOperation:UIDocumentSaveForOverwriting completionHandler:NULL];
}];
}
由于委托(delegate) (ChElementTVC) 从导航堆栈弹出 detailView,它的 viewWillAppear 被调用,fetchedResultsController.delegate 被恢复。
- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
if (!self.fetchedResultsController.delegate) {
DLog(@"Sleep Now %@", self);
//http://mobiledevelopertips.com/core-services/sleep-pause-or-block-a-thread.html
[NSThread sleepForTimeInterval:0.1];
DLog(@"Wake up %@", self);
[self fetchedResultsControllerWithPredicate:_savedPredicate]; // App Hangs Here ... This is sending messages to CoreData objects.
[self.tableView reloadData];
}
没有 [NSThread sleepForTimeInterval:0.1];
应用程序挂起。当我通过 Xcode 发送 SIGINT 时,我得到调试器并显示以下内容:
(lldb) BT
* thread #1: tid = 0x1c03, 0x30e06054 libsystem_kernel.dylib semaphore_wait_trap + 8, stop reason = signal SIGINT
frame #0: 0x30e06054 libsystem_kernel.dylib semaphore_wait_trap + 8
frame #1: 0x32c614f4 libdispatch.dylib _dispatch_thread_semaphore_wait$VARIANT$mp + 12
frame #2: 0x32c5f6a4 libdispatch.dylib _dispatch_barrier_sync_f_slow + 92
frame #3: 0x32c5f61e libdispatch.dylib dispatch_barrier_sync_f$VARIANT$mp + 22
frame #4: 0x32c5f266 libdispatch.dylib dispatch_sync_f$VARIANT$mp + 18
frame #5: 0x35860564 CoreData _perform + 160
(lldb) 帧选择 5
frame #5: 0x35860564 CoreData _perform + 160
CoreData _perform + 160:
-> 0x35860564: add sp, #12
0x35860566: pop {r4, r5, r7, pc}
CoreData -[NSManagedObjectContext(_NestedContextSupport) executeRequest:withContext:error:]:
0x35860568: push {r4, r5, r6, r7, lr}
0x3586056a: add r7, sp, #12
(lldb) 反汇编-f
CoreData _perform:
0x358604c4: push {r4, r5, r7, lr}
... snipped ...
0x35860560: blx 0x35938bf4 ; symbol stub for: dispatch_sync_f
-> 0x35860564: add sp, #12
0x35860566: pop {r4, r5, r7, pc}
另一种解决方法是可能的。在 -[ChElementTVC viewDidAppear:]
中对 fetchedResultsController.delegate 恢复进行编码也有效地延迟了主队列上的此设置。
另一种解决方法是在项目保存完成后在完成 block 中执行导航弹出:
#define SAVEDOCWITHCOMPLETION(__DOC__,__COMPLETION_BLOCK__)[ProjectDocumentHelper saveProjectDocument:__DOC__ completionHandler:__COMPLETION_BLOCK__]
void (^completionBlock)(BOOL) = ^(BOOL success) {
[self.navigationController popViewControllerAnimated:YES];
};
SAVEDOCWITHCOMPLETION(THE_CURRENT_PROJECT_DOCUMENT, completionBlock);
我认为保存操作在后台与主队列上的委托(delegate)恢复同时运行,但我不知道如何检验/证明/反驳该理论。
那么,有人可以解释发生了什么以及在这种情况下的最佳做法是什么吗?此外,欢迎提供学习引用。
最佳答案
我最终实现了第三种方法,即用完成 block 保存文档以序列化与 CoreData 存储交互的事务。
关于ios - 使用 +[NSThread sleep :] to resolve a deadlock issue,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12595421/
什么是僵局有益的例子? 最佳答案 如果你死锁的程序是病毒? 如果你想卡住一个进程,我想那将是你唯一应该这样做的时候......大声笑。 关于deadlock - 在什么情况下僵局是好事?,我们在Sta
我正在调试一个死锁问题,调用堆栈显示线程正在等待某些事件。 代码使用临界区作为同步原语我认为这里存在一些问题。 此外,调试器指向某个其他线程拥有的临界区,但锁计数为 -2。 根据我的理解 lock c
我已经用多种语言进行了编程,但我不知道我的代码中存在死锁。 我认为这意味着它不会发生。 这是否经常发生(在编程中, 而不是 在数据库中)足以让我担心吗? 最佳答案 如果两个条件为真,就会出现死锁:您有
我一直在读《The Little Book of Semaphores》,第 41 页有一个针对可重用屏障问题的解决方案。我遇到的问题是为什么它不会产生死锁情况。 1 # rendezvous 2 3
是否有任何方法可以在同一台计算机上运行NBD(网络 block 设备)客户端和服务器而不导致系统死锁? 我非常疲惫地寻找这个问题的答案。如果有人可以提供帮助,我将不胜感激。 更新: 我正在编写一个与
当我用 java 程序运行我的 jvmti 代理时,jvm 似乎遇到了死锁。在我的 jvmti 代理中,我在 Agent_OnLoad() 中创建了一个原始监视器,并在每个回调函数开始时进入该锁,并在
嗨,我正在尝试实现与多个客户端一起运行的服务器问题是服务器没有从输入流接收消息并等待它发生。如果客户端在写入后不关闭流,服务器将继续等待。客户端发送消息后,他尝试从输入流中读取等待响应,但服务器正在等
对于像这样的伪函数 void transaction(Account from, Account to, double amount){ Semaphore lock1, lock2;
死锁很难发现,而且消除起来也很不舒服。 如何找到代码中死锁的错误源?是否存在“死锁模式”? 在我的特殊情况下,它涉及数据库,但这个问题对于每个死锁都是开放的。 最佳答案 更新:最近的 MSDN 文章
在 java 中使用 Runtime.exec() 创建子进程时,我知道我必须填充输入/排出输出流以防止子进程阻塞。 有趣的是,Process 的javadoc多说一点: ...failure to
我正在努力用简单的词来解释线程中的“死锁”,所以请帮忙。什么是“死锁”的最佳示例(例如,在Java中),它如何逐步发生以及如何防止死锁?但无需深入细节。我知道这就像问两个相反的事情,但仍然如此。如果您
对于那些不熟悉的人,以下是用于流程协调的Peterson算法: int No_Of_Processes; // Number of processes int turn; // Whose turn
我在使用以下示例代码时遇到问题: from multiprocessing import Lock, Process, Queue, current_process def worker(work_q
关闭。这个问题是not reproducible or was caused by typos .它目前不接受答案。 这个问题是由于错别字或无法再重现的问题引起的。虽然类似的问题可能是on-topi
给定以下 Java 代码: public class Test { static private class MyThread extends Thread { private
当我尝试在 C# 中从 SQL 数据库中获取数据时,生成了这两个异常: System.Data.SqlClient.SqlException: Transaction (Process ID 97)
在另一方释放资源前,会话1和会话2都不可能继续。所以,SQL Server会选择死锁中的一个会话作为“死锁牺牲品”。 注意:死锁牺牲品的会话会被杀死,事务会被回滚。 注意:死锁与正常的阻塞是两个
两个线程同时访问fileName。 Set If 0 使死锁。但如果 1 一切顺利。 那么是什么导致了这种情况? 最佳答案 确保您没有在主线程上同步调用 +[PHAssetResource asset
我有一个带有弹出菜单的单线程 FLTK 应用程序,使用 Fluid 创建。我有一个子类 Fl_Gl_Window 并实现了一个 handle() 方法。 handle() 方法调用一个函数,该函数在右
package main import ( "fmt" "net/http" ) func Extract(url string) ([]string, error) { ht
我是一名优秀的程序员,十分优秀!