相关疑难解决方法(0)

在后台线程中显示UIAlertView

我从后台线程中的Web服务加载数据.UIAlertView当出现任何问题或在主线程中显示警报视图时,在后台线程中显示是否安全?

感谢您的建议

坦率

iphone objective-c

23
推荐指数
2
解决办法
2万
查看次数

替代闭包样式在 UI 线程中执行代码

从后台线程,当UI需要更新时,需要使用async(execute:)函数发布到DispatchQueue.main,如下所示:

static func executeInUIThread(_ uiThreadFunc: @escaping (Any?) -> Void, _ parms: Any?) {
  DispatchQueue.main.async {
    // Update UI 
    uiThreadFunc(parms)
  }
}
Run Code Online (Sandbox Code Playgroud)

可以访问闭包内部的uiThreadFuncand ,因为闭包从其“周围上下文”捕获变量parms

但可以说,我不喜欢 lambda 风格(在 swift 中称为闭包)编程。我怎样才能在不关闭的情况下做到这一点?

我尝试了以下操作:

static func executeInUIThread(_ uiThreadFunc: @escaping (Any?) -> Void, _ parms: Any?) {
  let workItem = DispatchWorkItem(block: EventLoopMgr.InternalExecuteInUIThread)

  DispatchQueue.main.async(execute: workItem)
}

private static func InternalExecuteInUIThread() {
  // How to execute the uiThreadfunc? This block doesn't take any parameters.
}
Run Code Online (Sandbox Code Playgroud)

它不起作用,因为初始化 DispatchWorkItem 时的块不带参数。因此,我无法通过uiThreadFunc …

ui-thread ios swift

6
推荐指数
1
解决办法
136
查看次数

CoreData和线程安全

我有一个单身名称CoreDataManager注册mergeContextChangesForNotification在其中:

+ (id) sharedManager{
    static CoreDataManager *mSharedManager = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        mSharedManager = [[CoreDataManager alloc] init];
    });
    return mSharedManager;
}

- (id)init
{
    self = [super init];
    if (self) {
        dispatch_async(dispatch_get_main_queue(), ^{
            [[NSNotificationCenter defaultCenter] addObserver:self
                                                 selector:@selector(mergeContextChangesForNotification:)
                                                     name:NSManagedObjectContextDidSaveNotification
                                                   object:nil];
        });
    }
    return self;
}
Run Code Online (Sandbox Code Playgroud)

我收到通知后:

- (void)mergeContextChangesForNotification:(NSNotification *)notification {
        [shareContext  performSelectorOnMainThread:@selector(mergeChangesFromContextDidSaveNotification:) 
                                        withObject:notification 
                                     waitUntilDone:YES];
}
Run Code Online (Sandbox Code Playgroud)

我有两个问题:

  1. 我应该performSelectorOnMainThread在这里使用吗?因为这个答案说永远不会.我应该把它改成GCD并使用dispatch_get_main_queue??
  2. 注册mergeContextChangesForNotificationin init是否是一种很好的做法,以确保通知始终在主线程中注册?我从这个答案中读到了

singleton core-data thread-safety ios

3
推荐指数
1
解决办法
4182
查看次数