iOS:如何检查一个变量是不是在 dispatch_async 的另一个 ViewController 中改变了他的值?
Posted
技术标签:
【中文标题】iOS:如何检查一个变量是不是在 dispatch_async 的另一个 ViewController 中改变了他的值?【英文标题】:iOS: How to check if a variable has changed his value in another ViewController in a dispatch_async?iOS:如何检查一个变量是否在 dispatch_async 的另一个 ViewController 中改变了他的值? 【发布时间】:2018-01-24 10:06:39 【问题描述】:我想知道如何检查另一个在后台运行的 ViewController 中的值是否发生了变化。我在后台下载的 Viewcontroller 中有该代码,下载完成后它会将 isSyncAutoOnGoing 设置为 NO。
ViewController.m
@interface ViewController ()
BOOL isSyncAutoOnGoing;
- (void) sync:(id) sender
isSyncAutoOnGoing = YES;
dispatch_queue_t downloadQueue = dispatch_queue_create("downloader", NUL
L);
dispatch_async(downloadQueue, ^
// do our long running process here
ListOfValueSync * lovSync = [[ListOfValueSync alloc] init];
// Synchronization
BOOL ret = [lovSync getAllListOfValueAll];
// do any UI stuff on the main UI thread
dispatch_async(dispatch_get_main_queue(), ^
[spinner stopAnimating];
[spinner removeFromSuperview];
isSyncAutoOnGoing = NO;
NSLog(isSyncAutoOnGoing ? @"sync Yes" : @"sync No");
if ([sender isKindOfClass:[UIButton class]])
self.loginField.text = @"";
(!ret) ? [self alertStatus:@"Can not synchronize" :@"Sync Failed!" :0] : [self alertStatus:@"Synchronization OK" :@"Sync OK" :0];
[sender setEnabled:TRUE];
);
);
这里是我想要检查的 FormViewController 何时 isSyncAutoOnGoing 等于 NO。我知道这不是我认为的好方法,而且,isSyncAutoOnGoing 的值始终等于 YES。
FormViewController.m
NSArray *viewControllers = [[self navigationController] viewControllers];
id obj;
for (int i = 0; i < [viewControllers count]; i ++)
obj = [viewControllers objectAtIndex:i];
if ([obj isKindOfClass:NSClassFromString(@"ViewController")])
BOOL isSyncAutoOnGoing = [[obj valueForKey:@"isSyncAutoOnGoing"] boolValue];
if (isSyncAutoOnGoing)
do
[NSThread sleepForTimeInterval:1.0];
NSLog([[obj valueForKey:@"isSyncAutoOnGoing"] boolValue] ? @"isSyncAuto: YES" : @"isSyncAuto: NO");
while([[obj valueForKey:@"isSyncAutoOnGoing"] boolValue]);
有什么想法吗?
提前致谢。
【问题讨论】:
有一些方法可以实现这一点。但首先你需要明确你的要求。作为您的代码,您正在使用spinner
阻止视图,因此当您导航到其他视图控制器时它总是错误的
图片下载后发布通知。在其他 VC 中观察该通知..
【参考方案1】:
假设数组在 AppDelegate 中
AppDelegate *appDelegate = [UIApplication sharedApplication].delegate;
self.allNewsItems = appDelegate.allNewsItems;
[appDelegate addObserver:self
forKeyPath:@"allNewsItems"
options:NSKeyValueObservingOptionNew
context:NULL];
并实施
- (void) observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object
change:(NSDictionary *)change context:(void *)context
if ([keyPath isEqualToString:@"allNewsItems"]) if ([self isBeingPresented])
[self.tableView reloadData]; else
self.mustReloadView = YES;
【讨论】:
以上是关于iOS:如何检查一个变量是不是在 dispatch_async 的另一个 ViewController 中改变了他的值?的主要内容,如果未能解决你的问题,请参考以下文章