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 中改变了他的值?的主要内容,如果未能解决你的问题,请参考以下文章

iOS 的单例模式 dispatch_once

如何在 Perl 中检查多个变量是不是为空

如何在 Pygame 中检查变量是不是包含矩形? [复制]

在过程宏中,如何检查字符串是不是是有效的变量名而不是关键字?

如何检查证书是不是在 iOS 上安装和信任

Twig - 如何检查变量是不是为数字/整数