UIActivityIndi​​catorView核心数据背景上下文提取

时间:2016-06-16 22:26:33

标签: ios swift core-data uiactivityindicatorview

我有一个核心数据背景上下文,用于从核心数据中获取大数据。我想在获取数据时显示UIActivityIndi​​catorView。

我的问题是,当我在启动获取过程之前启动UIActivityIndi​​catorView并在获取过程之后停止它时,活动指示器不会显示在屏幕上。所以我在后台块中包含了一个sleep(10),以确保活动指示器有足够的时间显示,但它没有显示。

我知道活动指示器是通过查看" Debug View Hierarchy"来加载的。在xcode上,它显示活动指示符位于顶部的视图层次结构中。

只有在核心数据背景上下文进程中使用它时才会发生这种情况。在其他所有情况下,活动指示符都会按预期显示。

以下是我使用的代码:

LoadingOverlay.shared.showOverlayWithMessage(self.view, message: "Loading ...")

let backContext = CDStack.shared.backgroundContext
backContext.performBlockAndWait { () -> Void in
    print("Fetching parts started ...")

    sleep(10)

    print("Fetching done!")
}

LoadingOverlay.shared.hideOverlayView()

后台上下文使用具有concurrencyType的NSPersistentStoreCoordinator的父上下文:.PrivateQueueConcurrencyType

我尝试了以下但没有运气。

dispatch_sync(dispatch_get_global_queue(Int(QOS_CLASS_USER_INITIATED.rawValue), 0)) { () -> Void in

        let backContext = CDStack.shared.backgroundContext
        backContext.performBlockAndWait { () -> Void in
            dispatch_async(dispatch_get_main_queue()) { () -> Void in
                LoadingOverlay.shared.showOverlayWithMessage(self.view, message: "Loading ...")
            }
            print("Fetching parts started ...")

            sleep(10)

            print("Fetching done!")
            dispatch_async(dispatch_get_main_queue()) { () -> Void in
                LoadingOverlay.shared.hideOverlayView()
            }
        }
    }

或以下内容:

dispatch_async(dispatch_get_main_queue()) { () -> Void in
    LoadingOverlay.shared.showOverlayWithMessage(self.view, message: "Loading ...")    
}
dispatch_sync(dispatch_get_global_queue(Int(QOS_CLASS_USER_INITIATED.rawValue), 0)) { () -> Void in

        let backContext = CDStack.shared.backgroundContext
        backContext.performBlockAndWait { () -> Void in

            print("Fetching parts started ...")

            sleep(10)

            print("Fetching done!")
        }
    }
dispatch_async(dispatch_get_main_queue()) { () -> Void in
    LoadingOverlay.shared.hideOverlayView()
}

我不明白为什么在与核心数据背景上下文活动一起使用时不显示ActivityIndi​​catorView。帮助

1 个答案:

答案 0 :(得分:0)

在您的示例中,发生的事情是,加载和关闭活动指示符的代码都在主线程上,因此它们都会立即运行。可以说,活动指示器同时加载和解除。主线程并不知道其他线程,反之亦然,所以如果你看一下你的例子并完全忽略背景代码,你就可以看出我的意思。

如果您希望在后台代码运行完毕后关闭活动指示器,请务必在该后台程序段中添加解雇代码

例如

LoadingOverlay.shared.showOverlayWithMessage(self.view, message: "Loading ...")

let backContext = CDStack.shared.backgroundContext

backContext.performBlockAndWait { () -> Void in
    print("Fetching parts started ...")

    //fetching code

    print("fetching done")

    dispatch_async(dispatch_get_main_queue()) {
        self.LoadingOverlay.shared.hideOverlayView()
    }
}