SetNeedsDisplay无法正常工作

我看到了许多与这个问题有关的线索,但没有解决我的情况(我认为)。

我的情况应该很简单,我有我的控制器中的自定义UIView ,从我的控制器,我使用[ self.myView setNeedsDisplay ],它完美的作品。

我有问题,当我试图从UIView本身内部调用这个…我有一个通知从另一个类发送,它正在接受我的观点(这工程)与它传递的信息,我更新这个视图的内部属性,比我打电话[self setNeedsDisplay ]希望我的屏幕更新与新的状态,但没有任何事情发生,我在drawRec方法内使用drawRec ,并没有被调用在这个时候,它只是当我的控制器类调用setNeedsDisplay时被调用,当发生这种情况时,应该发生的更新之前显示在屏幕上…我不知道为什么它不更新之前…

这里是一些代码:

我的控制器要求更新:(工作正常!)

 - (void)addNodeToNetwork:(DTINode *)node { [self.myNetwork addNodeInTheNetwork:node]; self.gridView.nodesToDraw = [self.myNetwork.nodesInNetwork copy]; CGRect tempRec = CGRectMake(node.nodePosition.x, node.nodePosition.y node.nodePosition.x, node.nodePosition.y); NSValue *rectObj = [NSValue valueWithCGRect:tempRec]; //transforma o cgrect num objeto [self.gridView.fatherNodes setValue:rectObj forKey:node.nodeName]; [self.gridView setNeedsDisplay]; } 

我的通知方法试图更新我的绘图:(不工作!)

 - (void) receiveTestNotification:(NSNotification *) notification { NSDictionary *userInfo = notification.userInfo; DTINode *notificationNode = [userInfo objectForKey:@"myNode"]; NSLog(@"Im Here!"); for (DTINode *node in self.nodesToDraw) { NSLog(@"Here too"); if(node.nodeName == notificationNode.fatherNode) { CGRect temp = CGRectMake(notificationNode.nodePosition.x, notificationNode.nodePosition.y, node.nodePosition.x, node.nodePosition.y); NSValue *tempObj = [NSValue valueWithCGRect:temp]; [self.fatherNodes setObject:tempObj forKey:notificationNode.nodeName]; [self setNeedsDisplay]; NSLog(@"Should REDRAW NOW!"); // It print this but no drawing is made! } } } 

我不粘贴我的drawRect在这里,因为它的作品,问题是,是不是从我的UIView setNeedsDisplay被调用!

任何人有任何想法,为什么这不工作?

经过大量的testing后,我看到一些与线程有关的事实,setNeedsDisplay只能在mainThread中调用…除了我从未在这个类中启动分离的线程,引发通知的类在一个辅助线程中…而且这是造成这个问题的原因

解决它我只是强迫在主线程中调用setNeedsDisplay ..

 dispatch_async(dispatch_get_main_queue(), ^{ [self setNeedsDisplay]; }); 

Swift 3:

 DispatchQueue.main.async { [weak self] in self?.setNeedsDisplay() } 

我认为使用它的正确方法是:

 [self setNeedsDisplay:YES]; 

虽然我总是有问题得到那个工作:(