Tag: multithreading

核心数据主要上下文并发性

所以我在过去的几个星期里一直在阅读和使用Core Data,并且使用以下设置来实现我的Core Data堆栈: 保存上下文 – 与商店绑定的根上下文,位于PrivateQueue上 主要上下文 – 在主线程上运行,保存上下文的subprocess 编辑上下文 – 在任何线程中按需创build,以编辑背景中的UI数据作为主要上下文的子项 有了这个设置,我没有任何问题,我已经采取了必要的预防措施,以防止多个背景编辑上下文同时调用[editMoc保存],但我没有看到相对于主线程是如何安全的/上下文。 具体来说,我在使用这个设置时看到的所有代码如下所示: [edit performBlock^{ [edit save:nil]; [main performBlock:^{ [main save:nil]; [root performBlock…] }]; }]; 现在我无法想象的是这样的:每当子环境保存时,数据就被传播到主环境中,但是没有任何事情发生,以确保数据当前不被读取/执行在主要的背景下,对吗? 基本上,我觉得像这样的事情会更合适: [edit performBlock^{ dispatch_async(dispatch_get_main_queue(), ^{ [edit save:nil]; }); [main performBlock:^{ [main save:nil]; [root performBlock….] }]; }]; 至less如果这样做,我们会确保传播相对于主线程/ UI是安全的,不是吗? 这种关系与我的另一个问题“为什么主要的语境真的应该和主线程有关呢?” 现在,如果我需要执行读取操作,我可以从主要的上下文中进行读取,而且我可以理解,在主线程中它是有意义的,但是如果传播只是“随时”发生的(因为我们不是在主线程中执行它们)将主线程绑定到底的最终目的是什么? 我甚至不需要去做,因为数据似乎已经从孩子保存的主要背景中抵达了,是吗? 从那里一个简单的[tableView重载]就足够了。 任何帮助表示赞赏! 编辑: 所以我想我已经find了我的问题的答案,那就是Core Data实际上是在内部使用正确的线程将更改从子上下文推送到父上下文(即使用父上下文的队列 – 在这种情况下会成为主队列)。 […]

即使数据库已更新,NSFetchRequest也会返回旧数据

我正在使用Coredata的multithreading应用程序。 当我在一个线程上保存一些数据时,它会进入数据库,但是当数据保存到数据库后,当我试图从不同的线程获取数据时,获取请求将返回旧数据。 对于如何解决这个问题,有任何的build议吗?

UI滚动时,应用程序停止从套接字接收数据

我有一个使用UDP套接字接收数据的iPad应用程序。 它有一个UIWebView浏览网页。 但是在UIWebView中滚动的时候,一切冻结,没有数据被接收。 我一直在寻找和它有关的runloops和线程。 但是,如果UIWebView不能运行在另一个线程以外的其他线程,如何在滚动时接收数据? 继续接收数据至关重要。 该项目使用Cocoa AsyncSocket的AsyncUdpSocket类,效果很好。 还有Matt Gallagher的单身课。 一切运行在主线程,UDP接收和UI。 提前致谢!

Objective C – 终止在后台运行的所有其他应用程序

我需要开发一个企业应用程序,它应该能够closures所有其他正在通过multithreading在非越狱 iOS设备上运行的应用程序。 几年前,我有一个名为PKiller或Process Killer的应用程序,列出所有当前正在运行的应用程序,包括他们的程序ID,并能够closures它们。 这是一款在官方AppStore上发布的应用程序,但当然由于违反了他们的指导方针,苹果公司将其删除了。 有谁知道如何获得当前正在运行的进程并closures它们? (再次这个应用程序不会去苹果/ AppStore,由于这是一个企业应用程序) 编辑: 我做了更深入的研究,发现你甚至无法在iOS 9中获得任何运行或安装的应用程序和连接的信息,如PID。 苹果公司使得sysctl不能再被沙箱化的iOS 9应用程序访问。 还有其他的方法 ,以获得任何第三个PID在iOS 9失败。

我可以在单独的线程中运行UIWebView吗?

我有一个运行JavaScript的Web应用程序,有时当主线程执行xhr调用和初始化video播放器等较重的工作时,它会冻结/挂起。 是否有可能在一个单独的线程运行一个UIWebView,以避免被阻止的Web视图?

iOS:如何阻止后台线程更新主线程中的用户界面?

我实现了一个UIImageView单元的UITableView,每个单元通过NSTimer每隔5秒定时刷新一次。 每个图像从后台线程的服务器加载,并从该后台线程,我也更新UI,显示新的图像,通过调用performSelectorOnMainThread 。 到现在为止还挺好。 目前,当我不等到一个图像被加载到当前单元格时,我会面临一个问题,并快速向下滚动到一个新的单元格。 然而,新的单元格显示的是前一个单元格的图像,而不是新单元格的图像。 虽然下一轮的NSTimer将会正确地显示图像,但是这可能首先会让用户感到困惑。 如果我不重用UITableView的单元格,问题就会消失,但是如果在我的应用程序中显示单元格的数量,这不是一个选项。 所以我能想到的唯一的解决scheme是取消(或杀死)将要显示旧图像的后台线程,如果我知道用户执行滚动操作。 我想知道这可能不是最好的做法,因此,寻求你的意见。 (我也不能使用SDWebImage,因为我的要求是显示从服务器加载的循环中的一组图像) // In MyViewController.m – (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { … NSTimer* timer=[NSTimer scheduledTimerWithTimeInterval:ANIMATION_SCHEDULED_AT_TIME_INTERVAL target:self selector:@selector(updateImageInBackground:) userInfo:cell.imageView repeats:YES]; … } – (void) updateImageInBackground:(NSTimer*)aTimer { [self performSelectorInBackground:@selector(updateImage:) withObject:[aTimer userInfo]]; } – (void) updateImage:(AnimatedImageView*)animatedImageView { @autoreleasepool { [animatedImageView refresh]; } } // In AnimatedImageView.m -(void)refresh { […]

用performSelectorOnMainThread调用非void函数

作为我的问题的标题说..我尝试调用一个非void函数performSelectorOnMainThread ..我的函数返回UIImage ,当我这样调用它: UImage *img = [self performSelectorOnMainThread:@selector(captureScreen:) withObject:webView waitUntilDone:YES]; 它给了我一个错误,我有不兼容的分配types,我也尝试像这样施放它 UImage *img = (UIImage*)[self performSelectorOnMainThread:@selector(captureScreen:) withObject:webView waitUntilDone:YES]; 我得到了语义问题:需要算术或指针types的types为“void”的操作数 我知道我可以把它作为正常的,但我尝试一些multithreading的东西,需要它像这样调用。所以我怎么能防止这个错误,请? 编辑: 我尝试在这个函数(captureScreen)中使用GCD,并且在“viewToCapture”上继续使用Exc_bad_access ..所以我决定调用GCD块内的父函数 dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0ul); dispatch_async(queue, ^{ [self captureScreenDelayed:pageView]; dispatch_sync(dispatch_get_main_queue(), ^{ }); }); 和“ captureScreenDelayed :”如下 – (void) captureScreenDelayed:(EpubPageViewController*)pageView { if(!pageView) pageView = [self currentPageView]; if(pageView.pageImageView) pageView.pageImageView.image = (UIImage*)[self performSelectorOnMainThread:@selector(captureScreen:) withObject:webView waitUntilDone:YES]; […]

核心数据线程和locking争用问题

我目前正在编写iOS应用程序的同步引擎。 我正在编写的一种方法是重新加载数据function,在该function中,应用程序会重新下载用户的数据以及所有照片。 这是一个昂贵的操作(时间上),所以我创build了一个NSOperation子类SSReloadDataOperation 。 它下载数据,获取当前用户实体,从当前用户中删除所有现有的照片,并重新填充。 然而,尽pipe我认为这是线程安全的,但是有时在操作正在运行并且-currentUser从其他地方访问时,应用程序崩溃,大概是在尝试获取它时。 其他时候,UI有时会冻结,并在debugging器中暂停显示它总是停在-currentUser NSFetchRequest执行调用。 我如何使这个操作线程安全和primefaces性,使我可以下载和重新填充,而不阻塞主UI线程,仍然有-currentUser可访问? 在使用锁或体系结构方面有什么缺失的吗? 谢谢! 码: – (void)main { // Download the photo data [[SyncEngine defaultEngine] getUserPhotosWithCompletionBlock:^(NSMutableArray *photos) { if (photos) { // Create a new NSManagedObjectContext for this operation SSAppDelegate* appDelegate = [[UIApplication sharedApplication] delegate]; NSManagedObjectContext* localContext = [[NSManagedObjectContext alloc] init]; [localContext setPersistentStoreCoordinator:[[appDelegate managedObjectContext] persistentStoreCoordinator]]; NSNotificationCenter* notificationCenter = […]

返回dispatch_async提取的variables

基本上:一个方法需要返回一个在dispatch_async中获取的NSDictionary。 这是我曾经试过的: – (NSDictionary *)fetchNSDictionary { dispatch_queue_t Queue = dispatch_queue_create("Dictionary fetcher", NULL); dispatch_async(Queue, ^{ NSDictionary *dict = … dispatch_async(dispatch_get_main_queue(),^{ return dict; )}; )}; } 结果: Incompatible block pointer types passing 'NSDictionary *(^)(void)' to parameter of type 'dispatch_block_t' (aka 'void (^)(void)') 有任何想法吗?

iOS – 并发访问内存资源

我的应用程序从服务器,数据和数据描述符下载几个资源。 这些由用户操作触发的下载可以同时执行,比方说,一次最多可下载50个下载。 所有这些asynchronous任务最终都会在内存中创build对象(例如将叶子附加到数据结构上,例如将可变字典或对象添加到数组中)。 我的问题是:这可能会导致稳定性问题? 例如,如果有几个同时发生的任务尝试将密钥添加到同一个字典中,我是否应该处理这种情况,放置某种锁? 如果我实现一个for循环来查找数组中的graphics元素,是否有可能其他正在运行的任务可能会在循环中更改数组内容? 关于除了官方文档以外的多任务,multithreading问题的任何参考或重要的一般定位?