Tag: multithreading

我如何在后台线程中准备我的UI?

一个UIViewController需要大约半秒来加载其内容并出现在屏幕上。 我怎样才能使他们都加载在后台,并显示他们准备好了?

不同线程(主/专用队列)中的pipe理对象上下文是否可以处理相同的对象?

我有主队列 ( AppDelegate中提供的默认上下文) NSManagedObjectContext ,并创build另一个NSManagedObjectContext 私人队列中请求数据更新到Web服务。 我使用主要上下文来获取所有对象在整个应用程序中显示和pipe理,我使用私有上下文来插入我从服务接收到的新对象,以避免阻塞用户界面,并避免与对象的“干扰”在用户和/或应用程序与他们一起操作的情况下的主要背景。 这两种情况是“兄弟姐妹”,他们不是父母和孩子。 这是因为我需要创build所有新的对象,以便后来知道是否应该删除它们中的一些(对象的属性指示)。 重点是,我有重复的对象集合,一个在主要上下文中,另一个在私有上下文中。 他们应该有不同的对象ID,但根据我的应用程序的逻辑,他们是“相同”的对象。 如果我在主要上下文中有一个objectA ,并且在私有上下文中接收到相同的objectA ,但是具有更新的值,则需要在private上下文objectAreplace为objectA 。 但是他们理论上有不同的objectID 。 我的问题是: 我可以在主要上下文中searchobjectA ,从那里删除它,并使用objectWithID将objectA从私有上下文“转移”到main? 考虑到主要内容在主队列中,而私人队列在私人队列中。 相反,我应该从主要上下文中删除objectA ,然后保存私有上下文,然后再从主要上下文中获取objectA ? 也许我应该以另一种方式处理这种情况… 提前致谢

dispatch_async中的dispatch_sync

我只是想确认为什么这是必要的。 我将这段代码添加到KIImagePager(一个cocoapod)来加载应用程序本地的图像(默认代码从一个url加载图像)。 这是我的工作代码基于什么同事build议: dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{ dispatch_sync(dispatch_get_main_queue(), ^{ [imageView setImage:[UIImage imageNamed:[aImageUrls objectAtIndex:i]]];; }); }); 我注意到,如果我拿出内部dispatch_sync,它的工作原理,但不是我想要的方式(当我开始滚动时图像分页器滚动视图上的一些图像尚未加载)。 但他们最终加载。 我的问题是,主队列上的同步调用是否将图像返回到UI(主队列上)? 因为它确实与删除的第二个asynchronous一起工作。

Swift CoreData:错误:严重的应用程序错误。 核心数据更改处理期间发生exception。

我正在写一个程序在iOS上,非常我正在面对这个错误: 2015-11-06 10:57:24.289 NETFNET [2503:976392] CoreData:error:严重的应用程序错误。 核心数据更改处理期间发生exception。 这通常是NSManagedObjectContextObjectsDidChangeNotification观察者中的一个错误。 – [__ NSCFSet addObject:]:尝试插入nil与userInfo(空)2015-11-06 10:57:24.293 NETFNET [2503:976392] ***终止应用程序由于未捕获的exception“NSInvalidArgumentException”,原因:' – [ __NSCFSet addObject:]:尝试插入nil' 我想从主线程和后台线程同时访问数据库。 我已经看到很多Objective C的解决scheme,但是没有一个适用于Swift(我不知道Objective C …)。 不幸的是,我不知道如何使用Grand Central Dispatch,事实上,我的程序并不需要几个步骤(我的意思是需要它,但是如果某个线程从一个函数失去一次信息,没有什么不好的发生)。 我只想在Swift 1或2上有稳定的程序,所以我会感谢任何帮助。

多个NSThreads同步

我想用NSThread来实现以下任务 我有一个主线程和三(3)workerThread T1,T2,T3。 所有这些从主线程同时开始,主线程有一个int sizevariables。 现在我想以一种方式同步所有三个线程,当我的每个线程都执行时,它将打印出下列内容: //在主线程中 – (void) mainFunction{ size = 0; NSThread* T1 = [[NSThread alloc] initWithTarget:self selector:@selector(workerThread:) object:@"T1"]; [T1 start]; NSThread* T2 = [[NSThread alloc] initWithTarget:self selector:@selector(workerThread:) object:@"T2"]; [T2 start]; NSThread* T3 = [[NSThread alloc] initWithTarget:self selector:@selector(workerThread:) object:@"T3"]; [T3 start]; } //工作线程 – (void) workerThread:(id)obj{ size++; NSLog(@"Thread:%@——–Size:%d,obj,size) } 我想要下面的输出: Thread:T1——-Size:1 Thread:T2——-Size:2 Thread:T3——-Size:3 […]

iOS:如何获得后台线程来重绘主线程上的视图

我的应用程序将查询数据库50次,然后通过将正确的UIImageView添加到另一个UIImageView来做出相应的反应,然后我希望应用程序在每个循环中立即显示。 唉,经过很多晚,我没能把它运行起来。 应用程序不会立即显示UIImageView。 话虽如此,当我放大或缩小中期循环时,UIImageViews将出现! 我肯定错过了什么… 到目前为止,除了最后一部分[UIScrollView performSelector …. 请提前帮助,谢谢。 UIScrollView *firstView; UIImageView *secondView; UIImageView *thirdView; NSOperationQueue *queue; NSInvocationOperation *operation; – (void)viewDidAppear:(BOOL)animated { queue = [NSOperationQueue new]; operation = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(getData) object:nil]; [queue addOperation:operation]; } – (void) getData { for (i=0 ; i < 50 ; i++) { //All the codes to facilitate XML […]

NSOperationQueue:麻烦理解命令

我无法理解NSOperationQueue工作方式。 说我有: NSOperationQueue *queue = [[NSOperationQueue alloc] init]; queue.maxConcurrentOperationCount=1; [queue addOperationWithBlock:^{ [someObject someSelector]; }]; [queue addOperationWithBlock:^{ [someObject anotherSelector]; }]; 第二个区块甚至在第一个区块完成之前被调用 – 与我想要的相反。 我尝试使用 – performSelectorOnMainThread:withObject:waitUntilDone:相反,但第二个块仍然是首先执行 – 大概是因为块线程没有在主线程上完成,所以它不会被waitUntilDone封锁。 我在我的someSelector块中添加了一个断点,并在第二个块内的断点之后到达。 我不太明白。 帮我!!

FMDatabaseQueue错误:数据库被locking

我有一个在后台线程运行的方法,所以(据我了解),我需要使用FMDatabaseQueue安全,可靠地访问我的SQLite数据库。 我正在做一个查询来检查logging的存在,之后立即UPDATE或INSERT取决于结果。 第一个查询运行良好,我得到了一个计数,但后面的查询不运行。 这是我得到的错误: 未知的错误调用sqlite3_step(5:数据库被locking)欧盟 这是我的代码: //Establish database queue NSString *path = [[PPHelpers documentsPath] stringByAppendingPathComponent:@"PilotPro2.db"]; FMDatabaseQueue *queue = [FMDatabaseQueue databaseQueueWithPath:path]; //Start thread-safe database queue [queue inDatabase:^(FMDatabase *dbq) { NSUInteger count; //The other parameters in this query are provided beforehand NSString *query = [NSString stringWithFormat:@"SELECT COUNT(%@) AS counter FROM %@ WHERE %@ = '%@'",columnID, model, columnID, […]

如何在swift中取消多个线程之一

那么..我在这样的情况:我有一个function,启动3个asynchronous线程。 每个线程都需要一些时间。 当某个线程完成后,我需要停止另一个线程,但是我不知道如何去做。 我的代码: class SomeController: UIViewController { override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view. threads(); } func threads(){ let operationQueue = NSOperationQueue(); operationQueue.addOperationWithBlock( { let thread = NSThread.currentThread(); let threadNumber = thread.valueForKeyPath("private.seqNum").integerValue; NSThread.sleepForTimeInterval(30); println("Task #1 completed on thread #\(threadNumber)"); }) operationQueue.addOperationWithBlock( { let thread = NSThread.currentThread(); let […]

在iOS上使用单独的线程联网

我开发的应用程序是与OS X服务器进行通信的iOS客户端。 这个应用程序的当前版本执行主线程上的所有networking逻辑,这对我想要做的工作很好。 但是,在下一个版本中,我希望networking逻辑更加灵活。 为了这个工作,我想专门给它一个单独的线程,但我不是很确定什么解决scheme适合我的需求。 起初,GCD看起来是一个很好的候选人,但似乎只适合在单独的线程上执行大量的工作。 我想要做的是在一个单独的线程上拥有所有的networking逻辑。 iOS客户端和OS X服务器之间的连接是持久的,所有的数据stream和处理都应该在这个单独的线程上进行。 问题归结为什么方法最适合这种情况? 编辑:为了摆脱任何困惑,我使用的连接使用套接字和NSStream实例。 我不处理连接到远程Web服务器。 换句话说,AFNetworking和ASIHttpRequest不是我的select。