我有一个核心数据背景上下文,用于从核心数据中获取大数据。我想在获取数据时显示UIActivityIndicatorView。
我的问题是,当我在启动获取过程之前启动UIActivityIndicatorView并在获取过程之后停止它时,活动指示器不会显示在屏幕上。所以我在后台块中包含了一个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()
}
我不明白为什么在与核心数据背景上下文活动一起使用时不显示ActivityIndicatorView。帮助
答案 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()
}
}