Objective-c自定义指标锁共享实例

时间:2012-04-19 22:20:21

标签: objective-c multithreading singleton block objective-c-blocks

我制作了一个自定义指示器,我可以通过一个块运行代码并在代码运行时显示一个指示器。

代码完成后,我调用第二个成功块并隐藏/删除指示符。

因为我不想实例化我想要使用它们的类中的每个指示符,所以指标对象是单例。

工作流:

  1. 创建指标
  2. 显示指标
  3. 运行代码块
  4. 运行成功阻止
  5. 隐藏指示器
  6. 从superview中删除
  7. Nullify共享实例
  8. 当我在彼此之后使用两个指示符时出现问题(登录后示例:,刷新数据)。

    当显示第二个指示符时,在第一个实例上调用hide方法。在第二个指标中,指标视图将从超级视图中删除。

    我没有管理自己的线程锁的经验,但我想用@synchronized(self)解决问题,但似乎它没有效果?

    + (Indicator *)create
    {
        if (!sharedIndicator)
        {
            sharedIndicator = [[Indicator alloc] initWithNibName:@"Indicator" bundle:nil];
        }
    
        return sharedIndicator;
    }
    
    + (Indicator *)createWithDelegate:(id <IndicatorDelegate>)delegate 
                                 message:(NSString *)message 
                                  inView:(UIView *)parentView
    {
        Indicator *indicator = [Indicator create];
        [indicator setDelegate:delegate];
        [indicator setMessage:message];
        [indicator setParentView:parentView];
    
        return indicator;
    }
    
    + (void)showInView:(UIView *)view 
           withMessage:(NSString *)message 
               execute:(BOOL (^)(void))executeBlock 
              complete:(void (^)(BOOL success))completed
    {
        Indicator *indicator = [Indicator createWithDelegate:nil message:message inView:view];
    
        [indicator show];
    
        __block BOOL success = NO;
    
        dispatch_async(dispatch_get_global_queue( DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^
        {    
            success = executeBlock();
    
            dispatch_async(dispatch_get_main_queue(), ^
            {
                completed(success);
    
                [indicator hide];
            });
        });
    }
    

1 个答案:

答案 0 :(得分:0)

每次显示指标时,您都会获得相同的View,因为它与sharedInstance相关联。