Tag: multithreading

asynchronousswift 3

我需要进行asynchronous调用,以便第二个方法只在第一个方法完成后调用。两种方法都是networking调用。 像这样的东西: signIn() getContacts() 我想确保getContacts只在signIn完成后被调用。 FWIW,我无法编辑方法签名,因为它们来自Google SDK。 这是我试过的: let queue = DispatchQueue(label: "com.app.queue") queue.async { signIn() getContacts() }

iOS:从后台线程创buildUIImage?

苹果文件说: 由于图像对象是不可变的,因此创build后不能更改其属性。 大多数图像属性是使用随附图像文件或图像数据中的元数据自动设置的。 图像对象的不可变性也意味着它们可以安全地从任何线程创build和使用。 链接 另外,如果你看看这个“线程安全的UIImage”问题的答案,可以得出结论,从任何线程使用它们是安全的(至less从iOS 9开始)。 然而 ,有评论抱怨的问题,尤其是关于在后台线程上创buildUIImage。 在我的情况下,我敢肯定,这导致animation停止工作的问题。 有人有这方面的见解吗?

rest套件坚持/性能问题与多重MOCs

这是我第一次使用RestKit和多个MOC的新版本,所以这让我有点难住。 我使用RestKit 0.20-pre5,并通过RestKit操作添加托pipe对象以及在整个应用程序中手动添加。 RestKits提供两个MOC来pipe理性能:mainQueue和PersistantStore对象上下文。 从检查RestKits代码中,所有新的被pipe理对象被保存到mainQueue MOC(基于RKObjectManager行433和各种指针地址的检查)。 由RestKit创build的对象得到保持良好(当然在调用保存之后),但是每当我在同一个mainQueue MOC中创build自己的ManagedObjects并保存它时,它们在我重新启动应用程序时不会保留。 (我经常保存有关的MOC) 这就是持久存储的地方。每当我保存持久存储与mainQueue MOC一起时,数据将持续存在。 我想这与RKManagedObjectStore合并更改有关,只要我调用保存在persistantStoreMOC(通过通知)所以…一切都很好? 问题是每当我保存两个上下文都有一个明显的滞后,至less持续1秒(它可以变化到3!)。 这种滞后似乎增加了我创build的NSManagedObjects。 我已经运行仪器,没有内存问题。 我必须错误地使用RestKits核心数据的实现。 对于我使用以下方法保存的logging: – (void)saveContext { __block BOOL _blockSuccess; __block NSError *_blockError; NSManagedObjectContext *persistantContext = [[[RKObjectManager sharedManager] managedObjectStore] persistentStoreManagedObjectContext]; [globalManagedObjectContext performBlockAndWait:^{ _blockSuccess = [globalManagedObjectContext save:&_blockError]; }]; if (! _blockSuccess) NSLog(@"Failed to save context: %@", _blockError); [persistantContext performBlock:^{ _blockSuccess = [persistantContext save:&_blockError]; […]

如果通过performSelectorInBackground控制UI,会发生什么情况?

我读了一些信息,UI界面只在MainThread上更新。 我需要asynchronous更新一些UIButton的,所以我使用performSelectorInBackground ,它在模拟器和设备(iPad4)上工作正常。 [self performSelectorInBackground:@selector(toggleToUpperWhenSingleShift) withObject:nil]; – (void)toggleToUpperWhenSingleShift{ shiftStateIndicator = 1; for (UIView *aPad in self.subviews) { if ( [aPad isKindOfClass:[UIButton class]] ) { UIButton *aButPad = (UIButton *)aPad; NSMutableString *currentTitle = [NSMutableString stringWithString:[aButPad titleForState:UIControlStateNormal]]; NSString *firstChar = [currentTitle substringToIndex:1]; [currentTitle replaceCharactersInRange:NSMakeRange(0, 1) withString:[firstChar uppercaseString]]; [aButPad setTitle:currentTitle forState:UIControlStateNormal]; [aButPad setTitle:currentTitle forState:UIControlStateHighlighted]; currentTitle = [NSMutableString stringWithString:[aButPad […]

在主线程上运行closures

我创build了一个类,比开发人员更容易实现select器视图。 在UIPickerView数据源方法中,我从闭包中返回值。 例: func pickerView(pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int { return pickerNumberOfRows!(component: component) } 我对所有的数据源方法使用相同的东西。 当我运行应用程序,它显示屏幕上的select器没有数据。 问题是我从闭包接收数据,而这些闭包在主线程上没有运行。 有没有办法在主线程上运行该闭包,并确保它返回一个适合数据源函数返回值types的值? (例如,从上面的例子来看,闭包将返回一个Int) 编辑: 我知道使用dispatch_async。 但是,在我的情况下,它不会帮助我。 假设我创build了一个在主线程上运行闭包的函数,并且需要返回值如下所示: func closureOnMainThread()->Int{ dispatch_async(dispatch_get_main_queue()) { // Run your code here return self.pickerNumberOfRows!(component: 0) } return 0 } 但是,在返callback度块内部的值之前,返回0的函数存在一个问题。 编辑2:弄清楚事情。 我的代码包含一个自定义类的select器和一个UIViewController实现它: class CustomPickerView: NSObject, UIPickerViewDelegate, UIPickerViewDataSource { var pickerNumberOfRows: ((component: Int)->Int)? //MARK: […]

如何停止使用dispatch_async创build的线程?

我想强行停止由dispatch_async创build的线程,如果它的使用时间过长,例如超过5分钟。 通过在互联网上search,我觉得有人认为没有办法阻止线程,有没有人知道? 在我的想象中,我想创build一个NSTimer来在指定的时间过后停止线程。 + (void)stopThread:(NSTimer*)timer { forcibly stop the thread??? } + (void)runScript:(NSString *)scriptFilePath { [NSTimer scheduledTimerWithTimeInterval:5*60 target:self selector:@selector(stopThread:) userInfo:nil repeats:NO]; dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ [LuaBridge runLuaFile:scriptFilePath]; }); } 我的runLuaScript方法: + (void)runLuaFile:(NSString *)filePath { lua_State *L = luaL_newstate(); luaL_openlibs(L); int error2 = luaL_dofile(L, [filePath fileSystemRepresentation]); if (error2) { fprintf(stderr, "%s", lua_tostring(L, -1)); lua_pop(L, 1); } lua_close(L); […]

MKOverlayView性能

我在地图上添加了大约3000个MKOverlay,正如你所想象的那样,有时需要一些时间,大约有八秒。 我正在寻找一种使用线程来提高性能的方法,因此用户可以在添加覆盖图时移动地图。 优选地,叠加层将按顺序添加,从地图区域内的开始。 我已经尝试了一些与GCD有关的事情: – (MKOverlayView*)mapView:(MKMapView*)mapView viewForOverlay:(id)overlay { __block MKPolylineView* polyLineView; //do the heavy lifting (I presume this is the heavy lifting part, but // because this code doesn't compile, I can't actually *test* it) // on a background thread dispatch_async(backgroundQueue, ^ { polyLineView = [[[MKPolylineView alloc] initWithPolyline:overlay] autorelease]; [polyLineView setLineWidth:11.0]; //if the title is […]

使用AFIncrementalStore和NSFetchedResultsController死锁

这几天我一直在抨击我的头,不能为我的生活弄清楚是怎么回事。 我非常青睐核心数据,但我知道这足以避免死锁的情况。 然而,对于这个项目,我决定尝试并纳入AFIncrementalStore。 我构build了一个示例项目来testingAPIClient,以便恰当地映射键/值而不会干扰我的实际项目。 它工作完美无瑕。 现在我在我的实际项目中使用它,事情是挑剔的。 NSFetchedResultsController被用在一个UITableViewController中,这个UITableViewController被推出屏幕(在类似于Facebook应用程序的菜单中滑动)。 大约有50%的时间我没有陷入僵局。 我已经确定NSFetchedResultsController managedObjectContext和我的AppDelegate是一样的。 几乎所有的设置都与AFIncrementalStore示例相同。 即使我的示例项目,以testing使用完美的作品。 当我在死锁期间暂停时,以下是Debug Navigator的图像。 它看起来像AFIncrementalStore的后台上下文和主线程的上下文之间的问题。 但是我不知道该怎么做,因为我没有写AFIncrementalStore,而是刚刚离开现有的文档/示例。 编辑:添加第二个线程的回溯 thread #2: tid = 0x2103, 0x925d180e libsystem_kernel.dylib`semaphore_wait_trap + 10 frame #0: 0x925d180e libsystem_kernel.dylib`semaphore_wait_trap + 10 frame #1: 0x0258cf08 libdispatch.dylib`_dispatch_thread_semaphore_wait + 16 frame #2: 0x0258ab3a libdispatch.dylib`_dispatch_barrier_sync_f_slow + 149 frame #3: 0x0258aa5c libdispatch.dylib`dispatch_barrier_sync_f + 37 frame #4: 0x00b64c8b CoreData`_perform + […]

如何在大型中央调度操作中运行asynchronous操作?

我有一个需要处理的作业队列,队列由定时器周期性地踢,而且当新的作业被添加到队列时,也通过调用线程。 当队列被踢时,我想在另一个线程上启动对队列的处理,因为我不想阻塞调用线程(在很多情况下这将是UI线程)。 所以为此,我对高优先级的并发队列运行一个macros中央调度操作,这会创build一个我的http类的实例,并通过它提交作业(作业基本上是一个http请求)。 http类在内部使用NSURLConnection执行asynchronous请求。 我的问题是GCD操作完成(因为它已经提交了所有的asynchronousHTTP请求),所以我猜它正在运行的线程要么清理,重用或退出。 这是消灭我的http类正在做这些asynchronousWeb请求的过程中。 我的问题是,如何让我的http类挂起,完成处理请求而不使GCD操作等待呢? 干杯

堆栈大小的次要线程,DEBUG和RELEASE版本之间的重大差异

在我的iPhone应用程序(XCode 3.2.4,iOS3.1.3)中,如果我在RELEASE模式下运行应用程序,一切正常,但在DEBUG模式下,应用程序崩溃,出现EXC_BAD_ACCESSexception。 该应用程序做一些复杂的计算。 所有主代码都包含在几个C ++静态库中,而UIApplication只从这些库中的一个创build一个对象,并调用此对象的一个​​方法。 如果我将一个调用复杂计算的代码放入辅助线程中,我仍然具有相同的行为:在DEBUG模式下EXC_BAD_ACCESSexception,在RELEASE模式下没有问题。 然后我查看了线程堆栈大小。 默认情况下,iOS设置线程堆栈大小,辅助线程为512 KB,主线程为1024 KB。 我已经查看了线程堆栈大小的最小值,以正确运行我的应用程序。 我发现了以下结果:RELEASE版本为40千字节。 DEBUG版本为1168千字节。 DEBUG版本中的1168 KB值解释了为什么在主线程中,应用程序将崩溃(主线程的默认堆栈大小为1024 KB)。 我真的不明白为什么我的应用程序的RELEASE和DEBUG版本之间所需的线程堆栈大小是如此不同(40 KB vs 1168 Kb !!!)。 我想要了解这个问题的任何帮助。 谢谢。 渣子