Tag: nsnotificationcenter

NSMetaDataQuery永远不会callbackNSMetadataQueryDidFinishGatheringNotification

对于我正在写的iCloud插件,我订阅了我的iCloudpipe理器类到这些iCloud NSMetaDataQuery观察者: // Add a predicate for finding the documents NSString* filePattern = [NSString stringWithFormat:@"*.%@", @"*"]; self.metadataQuery = [[NSMetadataQuery alloc] init]; // Before starting to query, it is required to set the search scope. arrayWithObject:NSMetadataQueryUbiquitousDocumentsScope]]; // It is also required to set a search predicate. [self.metadataQuery setPredicate:[NSPredicate predicateWithFormat:@"%K LIKE %@", NSMetadataItemFSNameKey, filePattern]]; // Listen for […]

在iPhone上处理时,如何使iPad上的iOS推送通知无效?

比方说,用户在iPhone和iPad上有一个消息应用程序。 他们从服务器得到一条新消息,所以推送通知被发送到他们的两个设备。 现在,用户拿起他们的iPhone,阅读通知中心的消息。 我现在如何从iPad的通知中心(和应用程序徽章号码)中删除消息,因为它已经被阅读了?

有什么方法可以在代码中“等待……” – 就像空循环一样?

考虑这个代码: [self otherStuff]; // "wait here…" until something finishes while(!self.someFlag){} [self moreStuff]; 请注意,这一切都发生在同一线程 – 我们不想去另一个线程。 otherStuff可以做的事情就像连接到云,从用户获得input等,所以这将需要很多时间,可以遵循许多可能的path。 otherStuff会在otherStuff最终完成时将self.someFlag设置为true。 这是完美的工作,没有任何问题,除了这是一个蹩脚的燃烧处理器像这样的空循环! 很简单,有没有办法说一些像.. halt here, until (some message, interrupt, flag, boolean, whatever?) 而不只是while(!self.someFlag){} (注意,另一种方法是“链接”程序…所以在“otherStuff”的结尾,你和其他所有程序员必须“知道”你不得不下一次调用“moreStuff”当然,当你必须添加新的程序或改变事物的顺序时,这是非常混乱的)干杯! 顺便说一句,关于当你想要不同的线程的情况已经有两个很好的答案。

为什么我的NSNotification被多次调用观察者?

在一个应用程序中,我使用了几个视图控制器。 在一个视图控制器上,观察者被初始化如下: [[NSNotificationCenter defaultCenter] removeObserver:self name:@"MyNotification" object:nil]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(myMethod:) name:@"MyNotification" object:nil]; 即使在初始化myMethod:的执行次数之前删除NSNotification myMethod:正由相应视图控制器上重复视图的myMethod:加起来。 为什么会发生这种情况,我该如何避免myMethod:多被调用一次。 注:我确定通过使用断点,我没有多次调用postNotification出错。 编辑:这是我的postNotification看起来像 NSArray * objects = [NSArray arrayWithObjects:[NSNumber numberWithInt:number],someText, nil]; NSArray * keys = [NSArray arrayWithObjects:@"Number",@"Text", nil]; NSDictionary * userInfo = [NSDictionary dictionaryWithObjects:objects forKeys:keys]; [[NSNotificationCenter defaultCenter] postNotificationName:@"myNotification" object:self userInfo:userInfo]; 编辑:即使移动我的订阅viewwillappear:我得到相同的结果。 myMethod:被多次调用。 (我重新加载viewcontroller的次数)。 -(void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; [[NSNotificationCenter defaultCenter] removeObserver:self […]

在iOS和OS X中获取系统范围通知的状态

我正在尝试写一个代码来处理iOS上的开/关屏幕(你可以看看类似的问题讨论这个问题)。 我为这个问题提供了OSX标签,因为OSX具有相同的系统范围通知function。 下面描述的问题是inheritance到通知设施(与iOS或OSX)。 有一个众所周知的方法来注册系统范围的通知com.apple.springboard.hasBlankedScreen在屏幕closures或打开时接收通知。 仅供参考(以下是用于注册系统范围通知的API): notify_post,notify_check_ notify_get_state和朋友 CFNotificationCenterPostNotification,CFNotificationCenterAddObserver和朋友 (内部使用notify_post等) 但是,这种方法存在两个相互关联的问题: 对于两个屏幕closures和通知的通知具有相同的名称(com.apple.springboard.hasBlankedScreen) 观察者没有收到状态作为通知的一部分。 因此,我们需要实现一些不同的屏幕打开和closures的解决scheme(因为相同的通知callback将被调用,并且没有参数将具有状态)。 一般来说,国家与通知callback脱钩的核心问题。 我看不出如何处理这个优雅。 我提出了两个简单的方法(每个都是有缺陷的)。 寻找另一种方法或改进这种方法的想法。 计数解决scheme 我们可以实施一个计数器来统计我们已经收到了多less通知,根据这些信息我们将知道是否通知打开或closures屏幕(基于我们的柜台的奇怪)。 但是,它有两个缺点: 1)在这种情况下,如果系统(由于devise时间的原因未知)将发送具有相同名称的附加通知,我们的逻辑将被拧紧,因为它会打破奇怪的检查。 2)另外,我们需要正确设置初始状态。 所以在代码中的某处我们会有这样的东西: counter = getInitialState(); registerForNotification(); 在这种情况下,我们有一个竞争条件。 如果系统会在getInitialState()之后发送通知并改变状态,但是在registerForNotification()之前,我们将以错误的计数器值结束。 如果我们会做以下代码: registerForNotification(); counter = getInitialState(); 在这种情况下,我们有另一种竞争条件。 如果系统发送通知并在我们做了registerForNotification()之后,但在getInitialState()之前改变状态,我们将得到一个计数器,将进入通知callback,并增加一个计数器(这会使其错误)。 确定通知收到解决scheme时的状态 在这种情况下,我们不存储任何计数器,而是在通知callback中使用API​​ notify_get_state来获取当前状态。 这有它自己的问题: 1)asynchronous传送到应用程序的通知。 所以,如果closures屏幕的速度非常快,您可以在屏幕已经打开的情况下收到两个通知。 所以,notify_check会得到一个当前的状态(相对于发送通知时的状态)。 因此,当应用程序将在通知callback中使用notify_get_state时,将确定有两个通知“屏幕已打开”,而不是一个通知“屏幕已closures”,另一个“屏幕已打开”。 PS一般来说,所有描述的问题都不是特定于屏幕开/关的情况。 它们对于具有独特状态并以相同的通知名称发送的任何系统范围的通知都是实际的。 更新1 我没有准确地testing开启/closures屏幕的情况,并且获得了notify_get_state()的相同结果。 然而,当我收到两个通知com.apple.springboard.lockstate (通过CFNotificationCenterAddObserver订阅)时,我有类似的情况,我使用另一个API来获取当前的设备locking状态,并收到两个通知相同的值。 所以这只是我的假设,notify_get_state也会返回相同的值。 不过,我认为这是受过教育的猜测。 notify_get_state的input参数对于两个调用是相同的(它不会改变)。 我不认为系统存储应该由notify_get_state返回的状态的FIFO队列。

是否可以使用通知回到IOS应用程序的主线程? (比较performSelectorOnMainThread)

是否可以使用通知回到IOS应用程序的主线程? (比较performSelectorOnMainThread)。 也就是说,有什么gottcha这个目的? 背景 想要从后台线程callback主UI线程(例如performSelectorInBackground) 可以使用performSelectorOnMainThread进行通信,但想知道是否可以使用通知? 例如 [[NSNotificationCenter defaultCenter] postNotificationName:@"ModelChanged" object:self];

使用KVO与NSNotificationCenter观察对可变arrays的更改

在我的模型中,我有一个名为events的对象数组。 我想我的控制器被通知每当一个新的对象被添加到事件。 我认为这样做的好方法是使用KVO模式在事件发生变化时得到通知(从添加新对象开始) // AppDelegate // events is a NSMutableArray @property/@synthesize etc… [appDelagate addObserver:self forKeyPath:@"events" options:NSKeyValueObservingOptionNew context:NULL]; 但是, observeValueForKeyPath方法没有被调用,我发现数组不符合KVO 🙁 一种select是通过为keyPath调用willChangeValueForKey来手动触发该方法 // ViewController [self willChangeValueForKey:@"events"]; [self.events addObject:event]; [self didChangeValueForKey:@"events"]; 但是这样感觉很重,因为我应该跟踪事件数组的前后状态,以便可以通过observeValueForKeyPath方法来访问它。 一种方法是使用一个标准数组(而不是可变的),每次我想添加一个新的对象时创build/设置一个新的事件实例,或者我可以创build一个单独的属性来跟踪可变数组(我希望你可以观察@“events.count”)。 另一种select是使用NSNotificationCenter。 我也读过一些build议使用块的答案(但我不知道从哪里开始)。 最后,我是否可以在我的委托中保存我的控制器实例,并发送相关消息? // Delegate [myController eventsDidChange]; 从代表保持对控制器的引用是否很奇怪? 我正在努力了解如何select哪个是最好的方法来使用,所以任何有关性能,未来的代码灵活性和最佳实践的build议,将不胜感激!

Swift 3 NSNotificationCenter键盘将显示/隐藏

我有一段代码在Swift 2中工作,我试图使用xCode更新代码到最新的版本,我修复了一切,除了两个问题 我有这个代码 let loginvc : LoginVC = self.storyboard?.instantiateViewController(withIdentifier: "LoginVC") as! LoginVC NotificationCenter.defaultCenter().addObserver(self, selector: #selector(LoginViewController.keyboardWillShow(_:)), name: UIKeyboardWillShowNotification, object: nil) NotificationCenter.defaultCenter().addObserver(self, selector: #selector(LoginViewController.keyboardWillHide(_:)), name: UIKeyboardWillHideNotification, object: nil) 与此一起配对 func keyboardWillShow(notification: NSNotification) { constraint.constant = -100 UIView.animate(withDuration: 0.3) { self.view.layoutIfNeeded() } } func keyboardWillHide(notification: NSNotification) { constraint.constant = 25 UIView.animate(withDuration: 0.3) { self.view.layoutIfNeeded() } } 在第一部分,我现在得到一个错误,说“types'LoginViewController'没有成员'keyboardwillshow / […]

为什么不从NSNotificationCenter删除观察者:addObserverForName:usingBlock被调用

我很困惑,为什么在下面的代码中永远不会删除观察者。 在我看来,我有以下几点: -(void)viewDidAppear:(BOOL)animated{ id gpsObserver = [[NSNotificationCenter defaultCenter] addObserverForName:FI_NOTES[kNotificationsGPSUpdated] object:nil queue:[NSOperationQueue mainQueue] usingBlock:^(NSNotification *note){ NSLog(@"run once, and only once!"); [[NSNotificationCenter defaultCenter] removeObserver:gpsObserver]; }]; } 观察者永远不会被移除,并且每次发送通知时都会输出语句。 任何人可以提供任何指导?

使用NSNotification将NSStringvariables传递给其他类

我想从一个类传递一个NSString到另一个类,并将NSString添加到我的第二个类中的一个NSMutableArray。 我相信我可以使用NSNotification这个,但我不知道如何通过一个variables通知。 我的代码是这样的: //class1.h #import <UIKit/UIKit.h> @interface ViewController : UIViewController @property(strong,nonatomic)NSString *variableString; @end //class1.m #import "ViewController.h" @interface ViewController () @end @implementation ViewController @synthesize variableString = _variableString; – (void)viewDidLoad { [super viewDidLoad]; [self setVariableString:@"test"]; [[NSNotificationCenter defaultCenter] postNotificationName: @"pasteString" object: _variableString]; // Do any additional setup after loading the view, typically from a nib. } – (void)viewDidUnload […]