Tag: multithreading

我如何重构我的代码在主线程上调用AppDelegate?

我最近开始将我的项目从Swift3 / Xcode8迁移到Swift4 / Xcode9。 我的应用程序在运行时崩溃,因为主线程清理程序只允许在主线程上访问UIApplication.shared.delegate ,导致启动时崩溃。 我有下面的代码,在Swift 3中工作正常 – static var appDelegate: AppDelegate { return UIApplication.shared.delegate as! AppDelegate; } 我的代码中的其他类可以访问appDelegate。 我需要找出一种方法来从主线程返回UIApplication.shared.delegate 。 注意 :从访问appDelegate位置使用DispatchQueue.main.async{}块不是一个选项。 只需要在static var appDelegate声明中使用它。 寻找一个聪明的解决方法。 相关的崩溃消息: 主线程检查器:UI API在后台线程上调用: – [UIApplication delegate] PID:1094,TID:30824,线程名称:(none),队列名称:NSOperationQueue 0x60400043c540(QOS:未知),QoS:0

为什么我应该为每个新线程或NSOperation创build一个NSManagedObjectContext,而不是在主线程上调用Core Data?

一些开发人员已经告诉我,我可以为每个新线程创build一个新的NSManagedObjectContext实例,以使Core Data线程安全。 那么我只好照顾之后的合并。 对我来说,这听起来像是很多额外的代码和开销。 是否有这个解决scheme不好的原因? 它来了: 而不是为每个新线程或每个NSOperation创build一个新的MOC,我将在主线程上执行MOC-更改,就像我们从UIKit知道的一样。 我只是调用-performSelectorOnMainThread:…waitUntilDone:YES并摆脱所有的核心数据并发问题。 优点: – 不必为每个Thread / NSOperation创build一个新的MOC。 – 不必将MOC合并在一起。 – 确保没有并发问题,因为核心数据保持在主线程安全的地方。 缺点: – 调用像-performSelectorOnMainThread:…waitUntilDone:YES看起来丑陋,难以阅读。 – 线程/ NSOperation被阻止。 但实际上,系统无论如何不能一次做多件事情。 就我而言,核心数据部分不是性能瓶颈。 围绕它的繁重计算是在后台线程或NSOperation中进行的。 你怎么看? 这值得探索吗? 为什么你仍然喜欢为每个新的线程/ NSOperation创build一个MOC,然后处理合并? 相比于在主线程上做这个,这有什么好处呢?

主线程在viewDidLoad中的一个并发队列上执行dispatch_async,或者在一个方法内部执行

所以在一些帮助下,我更清楚地知道嵌套的GCD在我的程序中是如何工作的。 原帖是: 确保我正确地解释嵌套的GCD 但是,您不需要阅读原始文章,但基本上这里的代码在后台运行数据库执行,并且UI是响应式的: -(void)viewDidLoad { dispatch_queue_t concurrencyQueue = dispatch_queue_create("com.epam.halo.queue", DISPATCH_QUEUE_CONCURRENT); dispatch_queue_t serialQueue = dispatch_queue_create("com.epam.halo.queue2", DISPATCH_QUEUE_SERIAL); for ( int i = 0; i < 10; i++) { dispatch_async(concurrencyQueue, ^() { NSLog(@"START insertion method%d <–", i); dispatch_sync(serialQueue, ^() { //this is to simulate writing to database NSLog(@"———-START %d———", i); [NSThread sleepForTimeInterval:1.0f]; NSLog(@"——–FINISHED %d——–", i); }); NSLog(@"END […]

将NSOperationinheritance到Internet操作并重试

我在后台线程中inheritancehttp post的NSOperation。 这些特定的httppost不需要任何值返回。 我想要做的是当我有一个错误或超时,我希望它发送后延长(斐波那契)。 到目前为止,我已经这样做了: NSInternetOperation.h: #import <Foundation/Foundation.h> @interface NSInternetOperation : NSOperation @property (nonatomic) BOOL executing; @property (nonatomic) BOOL finished; @property (nonatomic) BOOL completed; @property (nonatomic) BOOL cancelled; – (id)initWebServiceName:(NSString*)webServiceName andPerameters:(NSString*)parameters; – (void)start; @end NSInternetOperation.m: #import "NSInternetOperation.h" static NSString * const kFinishedKey = @"isFinished"; static NSString * const kExecutingKey = @"isExecuting"; @interface NSInternetOperation () @property […]

如何在特定的线程上locking一个NSLock

我有一个属性@property NSLock *myLock 我想写两个方法: – (void) lock 和 – (void) unlock 这些方法分别locking和解锁myLock ,无论调用哪个线程或队列,都需要这样做。 例如,线程A可能调用了lock但是队列B可能是调用unlock那个。 这两种方法都应该正常工作,而不报告我正试图解锁locking它的不同线程/队列的锁。 此外,他们需要同步做到这一点。

如何正确地打开和closures另一个线程上的NSStream

我有一个应用程序连接到另一个线程上使用NSStream服务器。 如果用户决定退出,应用程序也会closures连接。 问题是,我永远不能成功地closuresstream或线程在用户断开连接。 以下是我的代码示例,介绍了如何为networking创build线程并尝试closuresstream: + (NSThread*)networkThread { static NSThread *networkThread = nil; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ networkThread = [[NSThread alloc] initWithTarget:self selector:@selector(networkThreadMain:) object:nil]; [networkThread start]; }); return networkThread; } + (void)networkThreadMain:(id)sender { while (YES) { @autoreleasepool { [[NSRunLoop currentRunLoop] run]; } } } – (void)scheduleInThread:(id)sender { [inputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSRunLoopCommonModes]; [inputStream open]; } – […]

目标C中最好的multithreading方法?

我正在开发一个iPad应用程序,我目前正在努力寻找最佳的multithreading方法。 让我用一个简单的例子来说明这一点: 我有一个包含2个子视图的视图,一个目录select器和一个带有所选目录中所有图像缩略图的图库。 由于“下载”和生成这些缩略图可能需要相当长的一段时间我需要multithreading,因此视图的交互和更新不会被阻止。 这是我已经尝试过的: [self performSelectorInBackground:@selector(displayThumbnails 🙂 withObject:currentFolder]; 这工作正常,因为用户交互没有被阻止,但是当用户在第一个文件夹仍在加载的同时点击另一个文件夹时,它失败了。 两个线程正试图访问相同的视图和variables,导致彼此正确执行。 当用户点击另一个文件夹时,当前正在加载的文件夹的显示displayThumbnails应该被中止。 我没有find任何办法做到这一点.. NSThreads 我试过这个,但和第一种方法几乎一样的问题,我没有find一个(简单的)方法来取消正在进行的方法。 (是的,我知道[aThread cancel]但没有find一种方法来“恢复”线程)。 也许我应该NSThread并实现我自己的isRunning等方法? 但是没有更好的办法,或者我忽略了第三种(甚至是第四种和第五种)选项吗? 我认为这是一个相当简单的例子,我认为没有NSThread也许有更好的解决scheme。 那么,你会怎么做? 你的意见请!

在SpriteKit中,touchesBegan和SKScene更新方法在同一个线程中运行吗?

在这里的Apple文档中, 高级场景处理描述了update方法以及如何渲染场景,但是没有提及何时处理input。 不清楚它是否与渲染循环处于同一个线程中,或者与渲染循环是否一致。 如果我有一个对象,我从SKScene update方法和touchesBegan方法update (在这种情况下的SKSpriteNode ),我必须担心同步两个访问到我的对象吗?

应用挂在__psynch_mutexwait

我们的应用程序似乎半随机挂在psynch_mutexwait。 这似乎与更新CoreData中存储的一堆数据的后台进程有关 – 但是我完全无法弄清楚是谁locking了造成死锁的原因。 以下是lldb给我的完整堆栈跟踪 – 显然是不完整的,并且线程1的最后一帧是虚假的。 在那之前,我在这个方法中有一个断点,它从来没有被打过。 是否有任何方法来确定什么锁正在等待? (甚至可以得到正确的堆栈跟踪?)当然,涉及的代码很多,这使得随机的NSLog语句成为一个巨大的工作。 (lldb) bt all * thread #1: tid = 0x2503, 0x39da20fc libsystem_kernel.dylib`__psynch_mutexwait + 24, stop reason = signal SIGSTOP frame #0: 0x39da20fc libsystem_kernel.dylib`__psynch_mutexwait + 24 frame #1: 0x39ceb128 libsystem_c.dylib`pthread_mutex_lock + 392 frame #2: 0x00022068 OnDeck`-[AttendanceWorkoutsController buildTable](self=0x00000003, _cmd=0x00000000) + 508 at AttendanceWorkoutsController.m:100 thread #2: tid = 0x2803, […]

什么是iOS睡眠function

我正在寻找一个函数,把一个线程睡在iOS的c + +代码,甚至是Objective-C的代码,睡眠(0)不被我的编译器识别 谢谢,