Tag: multithreading

线程1错误:断点1.1

所以我得到一个线程错误线程1:断点1.1在我的IBAction函数。 代码运行没有错误,但是当我点击模拟器上的button,模拟器崩溃并产生断点错误。 受影响的代码是: @IBAction override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject!) { if testoEsercizio.text == "Per iniziare premi la tv" { var viewController : SecondoSchermo = segue.destinationViewController as SecondoSchermo viewController.stringaponte = "SI buono" } else { var viewController : SecondoSchermo = segue.destinationViewController as SecondoSchermo viewController.stringaponte = "NON buono" } } 我没有太多的线程错误的经验,并试图解决这个问题有点沮丧。 任何帮助表示赞赏。 谢谢

在主线程上运行NSURLSession完成处理程序

我正在使用NSURLSession来获取值来填充一个TableView。 我正在更新完成处理程序中的TableView,但使用[[NSThread currentThread] isMainThread]已经告诉我,完成处理程序没有在主线程中运行。 由于我只应该从主线程更新UI,我知道这是不正确的。 有没有办法从完成处理程序在主线程上触发一个动作? 或者是使用NSURLSession错误的方式去做这件事? NSURLSession *session = [NSURLSession sharedSession]; [[session dataTaskWithURL:[NSURL URLWithString:@"http://myurl"] completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) { NSError *jsonError = nil; NSArray* jsonUsers = [NSJSONSerialization JSONObjectWithData:data options:0 error:&jsonError]; if (jsonError) { NSLog(@"error is %@", [jsonError localizedDescription]); // Handle Error and return return; } self.userArray = jsonUsers; [self.userTableView reloadData]; if ([[NSThread […]

如何正确释放AVCaptureSession

我正在使用AV基础课程从摄像头捕捉实时videostream并处理video样本。 这很好。 但是,一旦完成,我确实遇到了正确释放AV基础实例(捕获会话,预览图层,input和输出)的问题。 当我不再需要会话和所有关联的对象时,我停止捕获会话并释放它。 这在大多数情况下是有效的。 但是,有时应用程序会崩溃,在调度队列创build的第二个线程(以及处理video样本的位置)中引发EXEC_BAD_ACCESS信号。 崩溃主要是由于我自己的类实例,它作为样本缓冲区委托,并在停止捕获会话后被释放。 Apple文档提到了这个问题:停止捕获会话是一个asynchronous操作。 那就是:它不会立即发生。 具体来说,第二个线程继续处理video样本并访问像捕获会话或input和输出设备的不同实例。 那么如何正确地释放AVCaptureSession和所有相关的实例呢? 是否有一个通知,可靠地告诉我,AVCaptureSession已经完成? 这是我的代码: 声明: AVCaptureSession* session; AVCaptureVideoPreviewLayer* previewLayer; UIView* view; 实例的设置: AVCaptureDevice* camera = [AVCaptureDevice defaultDeviceWithMediaType: AVMediaTypeVideo]; session = [[AVCaptureSession alloc] init]; AVCaptureDeviceInput* input = [AVCaptureDeviceInput deviceInputWithDevice: camera error: &error]; [session addInput: input]; AVCaptureVideoDataOutput* output = [[[AVCaptureVideoDataOutput alloc] init] autorelease]; [session addOutput: output]; dispatch_queue_t queue […]

iOS – 确保主线程执行

我想知道如何在主线程上调用我的function 。 我如何确保我的function在主线程上调用? (这是我之前的一个问题 )。

你可以用GCD / dispatch_async使用cancel / isCancelled吗?

我一直在想,你可以用你用GCD启动的线程取消/取消所有操作/ .isCancelled吗? 目前,我只是使用一个布尔值作为标志,来取消后台进程。 假设您想在后台执行大量的处理,同时保持UI的响应,以便您可以捕获取消button(或animation显示处理器正在工作)。 以下是我们如何做到的 @interface AstoundingView : UIView { BOOL pleaseAbandonYourEfforts; blah } @implementation AstoundingView // // these are the foreground routines… // begin, abandon and all-done // -(void)userHasClickedToBuildASpaceship { [YourUIStateMachine buildShip]; [self procedurallyBuildEnormousSpaceship]; } -(void)userHasClickedToAbandonBuildingTheSpaceship { [YourUIStateMachine inbetween]; pleaseAbandonYourEfforts = false; // that's it! } -(void)attentionBGIsAllDone { // you get here when the […]

GCD中的并发与串行队列

我正在努力完全理解GCD中的并发和串行队列。 我有一些问题,希望有人能够清楚地回答我的问题。 我正在读取串行队列被创build和使用,以便一个接一个地执行任务。 但是,如果发生以下情况: 我创build一个串行队列 我使用dispatch_async (在我刚创build的串行队列上)三次分派三个块A,B,C 这三个块是否会被执行: 按顺序A,B,C,因为队列是串行的 要么 同时(在parralel线程同时),因为我使用ASYNC调度 我读到我可以在并发队列上使用dispatch_sync来一个接一个地执行块。 在这种情况下,为什么串行队列甚至存在,因为我总是可以使用一个并发队列,在那里我可以同步调度尽可能多的块? 感谢您的任何好解释!

GCD,线程,程序stream和UI更新

我很难弄清楚如何把这一切放在一起。 我在Mac上有一个解谜应用程序。 你input谜题,按下一个button,当它试图find解决scheme的数量,分钟移动等,我想保持UI更新。 然后一旦完成计算,重新启用button并更改标题。 下面是一些示例代码从buttonselect器和解决函数:(请记住我从Xcode复制/粘贴,以便可能有一些失踪或其他一些错别字..但它应该让你知道我是什么,米试图做。 基本上,用户按下一个button,那个button是ENABLED = NO,函数调用来计算拼图。 在计算时,请使用移动/解决scheme数据更新UI标签。 然后一旦完成计算拼图,Button是ENABLED = YES; 按下button时调用: – (void) solvePuzzle:(id)sender{ solveButton.enabled = NO; solveButton.title = @"Working . . . ."; // I've tried using this as a Background thread, but I can't get the code to waitTilDone before continuing and changing the button state. [self performSelectorInBackground:@selector(createTreeFromNode:) withObject:rootNode]; // I've […]