Tag: multithreading

问题与GCD和太多的线程

我有一个图像加载器类提供NSURL加载和图像从networking,并执行完成块。 代码其实很简单 – (void)downloadImageWithURL:(NSString *)URLString completion:(BELoadImageCompletionBlock)completion { dispatch_async(_queue, ^{ // dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{ UIImage *image = nil; NSURL *URL = [NSURL URLWithString:URLString]; if (URL) { image = [UIImage imageWithData:[NSData dataWithContentsOfURL:URL]]; } dispatch_async(dispatch_get_main_queue(), ^{ completion(image, URLString); }); }); } 当我更换 dispatch_async(_queue, ^{ 与注释掉了 dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{ 图像加载速度要快得多,这是非常合乎逻辑的(在图像一次加载一个图像之前,现在一堆图像被同时加载)。 我的问题是,我可能有50个图像,我调用downloadImageWithURL:completion:方法,当我使用全局队列,而不是_queue我的应用程序最终崩溃,我看到有85 +线程。 问题是我连续50次调用dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH,0)会使GCD创build太多的线程吗? 我认为,gcd处理所有的treading,并确保线程的数量不是很大,但如果不是这样的话有什么办法可以影响线程数量?

同步读写访问实例variables在iOS中的高性能?

什么是最好的方式/最less等待的方式来同步读取/写入访问的Objective-C中的实例variables为iOS? variables读取和写入的频率很高(假设每秒读写1000次)。 更改立即生效并不重要。 读取获得一致的数据并不重要,但写入迟早会反映在读取数据中。 有一些数据结构允许这个吗? 我想到了这个: 创build两个variables而不是一个variables; 我们称它们为v[0]和v[1] 。 对于每个v[i] ,创build一个并发调度队列来构build一个读写器locking机制。 我们称他们为q[i] 。 现在对于写操作,只有v[0]被写入,遵循q[0]的locking机制。 在读取操作中,首先读取v[1] ,并且仅在某个机会(例如1%)下读取操作查看v[0]并在必要时更新v[1] 。 下面的伪代码说明了这一点: typedef int VType; // the type of the variable VType* v; // array of first and second variable dispatch_queue_t* q; // queues for synchronizing access to v[i] – (void) setV:(VType)newV { [self setV:newV at:0]; } – (void) […]

从@synchronized块内的方法返回

我只想知道是否build议从@synchronized块中的方法return ? 例如: – (id)test { @synchronized(self) { if (a) return @"A"; else return @"B"; } } 而不是: – (id)test { NSString *value; @synchronized(self) { if (a) value = @"A"; else value = @"B"; } return value; } 这个示例是相当简单的,但有时在一个复杂的方法,它会使事情变得更简单,从一个@synchronized块内返回。

Core-Data executeFetchRequest在后台线程中冻结App

我有一个saveMOC的直接父母的mainMOC ,我需要在线获取另一个tmpMOC为了不阻止我的用户界面,同时从互联网上获取大量的logging。 我的应用程序冻结。 我可以缩小到这一点: fetchedItems = [tmpMOC executeFetchRequest:fetchRequest error:&error]; 我试图把这封装在dispatch_sync , [moc.parentcontext.parentcontext.persistentStoreCoordinator lock/unlock] , [whatevermoc performBlockAndWait] … 我也试图取出_mainMOC …没办法… 我明白, executeFetchRequest是不是线程安全的,所以,我怎么locking我需要locking,以确保我没有插入一个双? 任何人都可以帮忙? 更新(1) AppDelegate中的_saveMOC实例: – (NSManagedObjectContext *)managedObjectContext { if (_mainMOC != nil) { return _mainMOC; } if (_saveMOC == nil) { NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator]; if (coordinator != nil) { _saveMOC = [[NSManagedObjectContext alloc] […]

如果不使用CoreAnimation,如何避免“CoreAnimation警告已删除的线程与未提交的CATransaction”

就在appdelegates中,applicationDidBecomeActive。 我创build并启动一个线程,此线程等待asynchronous下载,然后保存数据: – (void)applicationDidBecomeActive:(UIApplication *)application { // begins Asynchronous download data (1 second): [wsDataComponents updatePreparedData:NO]; NSThread* downloadThread = [[NSThread alloc] initWithTarget:self selector: @selector (waitingFirstConnection) object:nil]; [downloadThread start]; } 然后 -(void)waitingFirstConnection{ while (waitingFirstDownload) { // Do nothing … Waiting a asynchronous download, Observers tell me when // finish first donwload } // begins Synchronous download, and […]

工作者线程iOS

我想在iPhone上创build一个后台线程,每10毫秒执行一些代码。 但是在我再次迷失在并发编程指南和苹果的线程编程指南之前,我想问一下这里的某个人能否帮我一把。 我想做的事: 创build一个后台工作线程 每10毫秒触发一次方法的执行。 (可能通过在该线程中使用NSTimer?) 尽可能减less主应用程序线程的负载 根据我的理解,子类化NSThread并在这个子类中写入我自己的主要方法应该可以做到。 这样,我不使用NSTimer的更新间隔,但像这样: [NSThread sleepForTimeInterval: 0.01]; 主线程和工作线程之间的排队机制也没有任何意义,因为工作线程应该反复执行相同的操作 – 直到停止。 问题是:如何configuration线程使用计时器? 我看不到如何将NSTimer附加到该工作线程运行循环?

核心数据multithreading存储关系

我的问题很奇怪,我正在寻求帮助。 我想向你解释我的系统是如何工作的。 我有两个问题。 我正在申请有两张桌子。 我正在使用核心数据。 表是类别和产品 ,在核心数据中我已经build立了一对多的关系类别可以有多个产品 , 产品可以捧一个Categroy 。 这是基本的模式 Category { site_id name allProducts ->> Product } Product { site_id name category -> Category } 这是简单的模型产品和catwegories有更多的属性 在那个应用程序中,我有更新过程,并且该过程在后台线程中工作。 我已经创build了该线程的上下文,以及我在该上下文中存储的所有更改。 所有的调用我在后台线程中执行 [context performBlock:^{ // all my operations for updating storing categories and products }] 这是更新过程的stream程 从服务器获取JSON与类别数据 从服务器获取JSON与产品数据 从服务器获取JSON与类别具有哪些产品array((category_site_id > array(product_site_id1, product_site_id2…)) 通过类别JSON和商店类别实体,我从JSON获取名称和site_id并创build实体并设置这些属性 传递产品JSON并创build产品实体,并从JSON的属性中设置名称和store_id 然后是主要部分 现在我需要将产品连接到基于步骤3中的JSON的类别,这是一个问题。 […]

Swift,dispatch_group_wait不等

我正在尝试使用大中央调度等待文件完成下载之前继续。 这个问题是从这个衍生出来的: Swift(iOS),等待所有图像在返回之前完成下载 。 我只是试图找出如何让dispatch_group_wait(或类似)实际上等待,而不是在下载完成之前继续。 请注意,如果我使用NSThread.sleepForTimeInterval而不是调用downloadImage,它会等待很好。 我错过了什么? class ImageDownloader { var updateResult = AdUpdateResult() private let fileManager = NSFileManager.defaultManager() private let imageDirectoryURL = NSURL(fileURLWithPath: Settings.adDirectory, isDirectory: true) private let group = dispatch_group_create() private let downloadQueue = dispatch_queue_create("com.acme.downloader", DISPATCH_QUEUE_SERIAL) func downloadImages(imageFilesOnServer: [AdFileInfo]) { dispatch_group_async(group, downloadQueue) { for serverFile in imageFilesOnServer { print("Start downloading \(serverFile.fileName)") //NSThread.sleepForTimeInterval(3) // […]

iOS AudioSessionSetActive()阻塞主线程?

在我的iOS应用程序中,我试图实现“躲闪”:当我的应用程序播放一个简短的“命令式”声音时,任何背景音乐都应该降低音量。 播放完毕后,音量应该恢复到原来的值。 实施后,躲避基本上按预期工作。 但是,当我在audioPlayerDidFinishPlaying中调用AudioSessionSetActive(NO)时:为了结束回避,在此时发生的任何UI更新中都有一个小的停顿。 这涉及到自定义绘图,以及为前。 自动滚动文字等等。 现在,这是一个问题: 这是iOS6中的一个已知问题吗? 我在iPod / iOS5上运行相同的代码,我没有看到这种行为。 或者我错过了代码的东西? 也许你们中的一个已经遇到同样的问题,并find一个可行的解决scheme。 非常感谢您的支持, 戈茨 – (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { //… NSError *err = nil; [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryAmbient error:&err]; //… } – (void) playSound { // Enable ducking of music playing in the background (code taken from the Breadcrumb iOS Sample) UInt32 value = […]

NSOperationQueue vs GCD

在什么情况下,你宁愿使用NSOperationQueue不是GCD? 从我对这两者的有限经验来看,我认为NSOperationQueue基本上可以控制有多less并发操作。 GCD你不能这样做,因为你正在使用一个队列。 除了你可以用多核处理器模拟这个,但是我仍然觉得没有办法控制它。