- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试通过使用 grand central dispatch 创建一个后台线程,并通过 alertcontroller 操作在此处执行一些操作,但它会阻塞主线程。这是我的完整类(class)代码,请检查,因为我找不到我做错了什么? :
class DisplayMangaViewController: UIViewController, UIScrollViewDelegate, UIPageViewControllerDataSource, UIToolbarDelegate {
//variables set there
@IBAction func actionBarButtonItem(sender: AnyObject) {
if let popoverController = controller!.popoverPresentationController {
popoverController.barButtonItem = sender as! UIBarButtonItem
}
self.presentViewController(controller!, animated: true, completion: nil)
}
@IBAction func actionTabBarItem(sender: AnyObject) {
ActionSheetStringPicker.showPickerWithTitle("Sayfaya Git", rows: self.pages, initialSelection: self.pageCounter, doneBlock: {
picker, value, index in
var pageIndex = index.integerValue - 1
let aimedController = self.getItemController(pageIndex)!
let startingViewControllers: NSArray = [aimedController]
self.pageViewController!.setViewControllers(startingViewControllers as [AnyObject], direction: UIPageViewControllerNavigationDirection.Forward, animated: false, completion: nil)
return
}, cancelBlock: { ActionStringCancelBlock in return }, origin: sender)
}
override func viewDidLoad() {
super.viewDidLoad()
self.navigationItem.title = self.currentChapter
setActionSheet()
}
private func createPageViewController() {
let pageController = self.storyboard!.instantiateViewControllerWithIdentifier("PageViewController") as! UIPageViewController
pageController.dataSource = self
if self.currentToolBar.hidden {
pageController.view.frame = CGRect(x: 0.0, y: 0.0, width: self.view.frame.size.width, height: (self.view.frame.size.height))
}else {
pageController.view.frame = CGRect(x: 0.0, y: 0.0, width: self.view.frame.size.width, height: (self.view.frame.size.height - 40.0))
}
if imageUrlsList.count > 0 {
let firstController = getItemController(0)!
let startingViewControllers: NSArray = [firstController]
pageController.setViewControllers(startingViewControllers as [AnyObject], direction: UIPageViewControllerNavigationDirection.Forward, animated: false, completion: nil)
}
pageViewController = pageController
addChildViewController(pageViewController!)
self.view.addSubview(pageViewController!.view)
pageViewController!.didMoveToParentViewController(self)
}
func pageViewController(pageViewController: UIPageViewController, viewControllerBeforeViewController viewController: UIViewController) -> UIViewController? {
let itemController = viewController as! PageItemViewController
if itemController.itemIndex > 0 {
return getItemController(itemController.itemIndex-1)
}
return nil
}
func pageViewController(pageViewController: UIPageViewController, viewControllerAfterViewController viewController: UIViewController) -> UIViewController? {
let itemController = viewController as! PageItemViewController
if itemController.itemIndex+1 < pages.count {
return getItemController(itemController.itemIndex+1)
}
return nil
}
private func getItemController(itemIndex: Int) -> PageItemViewController? {
pageCounter = itemIndex
setLabel()
if itemIndex < pages.count {
let pageItemController = self.storyboard!.instantiateViewControllerWithIdentifier("PageItemViewController") as! PageItemViewController
pageItemController.itemIndex = itemIndex
pageItemController.totalItem = self.pages.count
pageItemController.strUrl1 = self.imageUrlsList[pageCounter]
pageItemController.strUrl2 = self.imageUrlsList[(pageCounter + 1)]
return pageItemController
}
return nil
}
func presentationCountForPageViewController(pageViewController: UIPageViewController) -> Int {
return pages.count
}
func presentationIndexForPageViewController(pageViewController: UIPageViewController) -> Int {
return 0
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}
override func viewWillAppear(animated: Bool) {
self.view.addGestureRecognizer(tapGesture)
self.tabBarController?.tabBar.hidden = true
}
override func viewDidAppear(animated: Bool) {
if !userDefaults.boolForKey("kalınanMangaBool"){
var viewToDisplay : UIWindow = UIApplication.sharedApplication().windows.last as! UIWindow
self.mbProHud = MBProgressHUD.showHUDAddedTo(self.view, animated: true)
self.mbProHud.dimBackground = true
self.mbProHud.mode = MBProgressHUDMode.Indeterminate
self.mbProHud.labelText = "Yükleniyor!.."
UrlAndNameList.getPageUrlsOfChapter(currentChapter, ofManga: self.obtainedManga.name)
}else{
var encodedObject : NSData? = userDefaults.objectForKey("kalınanManga") as? NSData
self.obtainedManga = NSKeyedUnarchiver.unarchiveObjectWithData(encodedObject!) as! Manga
currentChapter = obtainedManga.chapterNu
pageCounter = obtainedManga.pageNu
self.pageCounter = 0
pages = userDefaults.objectForKey("kalınanMangaPages") as! [String]
self.imageUrlsList = userDefaults.objectForKey("kalınanMangaImageUrlsList") as! [String]
self.navigationItem.title = obtainedManga.name + " " + currentChapter
setLabel()
createPageViewController()
}
}
func setActionSheet(){
controller = UIAlertController(title: "Seçenekler", message: "Ne yapmak İstersiniz?", preferredStyle: .ActionSheet)
let actionDownload = UIAlertAction(title: "Bölümü İndir", style: UIAlertActionStyle.Default, handler: {(paramAction : UIAlertAction!) in
var mbProHud : MBProgressHUD!
var viewToDisplay : UIWindow = UIApplication.sharedApplication().windows.last as! UIWindow
mbProHud = MBProgressHUD.showHUDAddedTo(viewToDisplay, animated: true)
mbProHud.customView = UIImageView(image: UIImage(named: "37x-Checkmark.png"))
mbProHud.mode = MBProgressHUDMode.CustomView
mbProHud.dimBackground = true
mbProHud.labelText = "İndirme Başlatıldı!"
mbProHud.hide(true, afterDelay: 2)
let qos = Int(QOS_CLASS_BACKGROUND.value)
dispatch_async(dispatch_get_global_queue( DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), {
var selectedChapters : [String] = [self.currentChapter]
var mangaNameArray = [self.obtainedManga.name]
let notification = NSNotification(name: "downloadListNotification", object: self, userInfo: ["downloadList" : selectedChapters, "mangaName" : mangaNameArray])
self.downloadChapter(notification)
//NSNotificationCenter.defaultCenter().postNotification(notification)
})
})
controller!.addAction(actionDownload)
let actionShare = UIAlertAction(title: "Paylaş", style: UIAlertActionStyle.Default, handler: {(paramAction : UIAlertAction!) in
var itemsToShare : [String] = [self.obtainedManga.name, self.obtainedManga.chapterNu, self.pages[self.pageCounter], "Süperr bi mangadan süperr bi sahne! TürkİşManga Aracılığıyla..."]
let activityViewController = UIActivityViewController(activityItems: itemsToShare, applicationActivities: nil)
self.presentViewController(activityViewController, animated: true, completion: nil)
})
controller!.addAction(actionShare)
let actionSave = UIAlertAction(title: "Favorilere Ekle", style: UIAlertActionStyle.Default, handler: {(paramAction : UIAlertAction!) in
self.addToFav(self.obtainedManga)
})
controller!.addAction(actionSave)
let actionSettings = UIAlertAction(title: "Ayarlar vs.", style: UIAlertActionStyle.Default, handler: {(paramAction : UIAlertAction!) in
self.performSegueWithIdentifier("ayarlar", sender: self)
})
controller!.addAction(actionSettings)
let actionAboutUs = UIAlertAction(title: "Biz Kimiz?", style: UIAlertActionStyle.Default, handler: {(paramAction : UIAlertAction!) in
self.performSegueWithIdentifier("hakkımızda", sender: self)
})
controller!.addAction(actionAboutUs)
let actionCancel = UIAlertAction(title: "İptal", style: UIAlertActionStyle.Default, handler: nil)
controller!.addAction(actionCancel)
}
func downloadChapter(notification : NSNotification){
let userDefaults = NSUserDefaults.standardUserDefaults()
var filePath : String = "Turk Isi Manga"
let qos = Int(QOS_CLASS_USER_INITIATED.value)
//dispatch_async(dispatch_get_global_queue( qos, 0), {
var chaptersToDownload : [String] = notification.userInfo!["downloadList"] as! [String]
var mangaName : String = (notification.userInfo!["mangaName"] as! [String]).first!
var downList : [DownloadingManga] = []
for chapter in chaptersToDownload{
var down = DownloadingManga()
down.mangaName = mangaName
down.chapterName = chapter
down.progress = 0
down.title = down.mangaName + " " + down.chapterName + "İndirilen \(down.progress)"
downList.append(down)
}
var encodedObject : NSData? = userDefaults.objectForKey("currentDownloadingList") as? NSData
var unarchivedlist = NSKeyedUnarchiver.unarchiveObjectWithData(encodedObject!) as! [DownloadingManga]
unarchivedlist.extend(downList)
var archivedList = NSKeyedArchiver.archivedDataWithRootObject(unarchivedlist)
userDefaults.setObject(archivedList, forKey: "currentDownloadingList")
userDefaults.synchronize()
let path = NSURL.documentsFolder().URLByAppendingPathComponent("\(filePath)/covers/\(mangaName)")
let manager = NSFileManager.defaultManager()
if (manager.fileExistsAtPath("\(path)")) {
println("cover image of manga named \(mangaName) has already saved")
}else{
var query = PFQuery(className:"MangaNamesAndUrls")
query.whereKey("mangaName", equalTo: mangaName)
query.findObjectsInBackgroundWithBlock {
(objects: [AnyObject]?, error: NSError?) -> Void in
if error == nil {
if let objects = objects as? [PFObject] {
var url = objects[0].objectForKey("coverImageUrl") as! String
if Reachability.isConnectedToNetwork(){
let url : NSURL? = NSURL(string: url)
let urlRequest = NSMutableURLRequest(URL: url!, cachePolicy: NSURLRequestCachePolicy.ReturnCacheDataElseLoad, timeoutInterval: 15.0)
var response: AutoreleasingUnsafeMutablePointer<NSURLResponse?> = nil
var error : NSErrorPointer = nil;
if let data = (NSURLConnection.sendSynchronousRequest(urlRequest, returningResponse: response, error: error) as NSData?) {
if let img = UIImage(data: data){
let filePath = NSURL.documentsFolder().URLByAppendingPathComponent("\(filePath)/covers/\(mangaName)")
println("file path that cover image will be saved is \(filePath)")
var fileError : NSErrorPointer = nil
filePath.setResourceValue(NSNumber(bool: true), forKey: NSURLIsExcludedFromBackupKey, error: fileError)
UIImagePNGRepresentation(img).writeToURL(filePath, atomically: true)
}
}else{
}
}
}
} else {
println("Error: \(error!) \(error!.userInfo!)")
}
}
}
for chapter in chaptersToDownload{
self.createDirectory(mangaName, chapter: chapter)
var pagesList : [String] = []
var succeed = false
var query = PFQuery(className: "MangaItems")
query.whereKey("mangaName", equalTo: mangaName)
query.whereKey("chapterName", equalTo: chapter)
query.findObjectsInBackgroundWithBlock {
(objects: [AnyObject]?, error: NSError?) -> Void in
println(objects?.count)
if error == nil {
if let inobjects = objects as? [PFObject] {
for object in inobjects {
if let pages = object.objectForKey("pages") as? [String] {
pagesList.extend(pages)
println(pages)
}
}
}
}else{
println("Error: \(error!) \(error!.userInfo!)")
}
var counter = 0
for var i = 0 ; i < pagesList.count ; i++ {
println("attempted to download page number : \(i)")
if Reachability.isConnectedToNetwork(){
let url : NSURL? = NSURL(string: pagesList[i])
let urlRequest = NSMutableURLRequest(URL: url!, cachePolicy: NSURLRequestCachePolicy.ReturnCacheDataElseLoad, timeoutInterval: 15.0)
var response: AutoreleasingUnsafeMutablePointer<NSURLResponse?> = nil
var error : NSErrorPointer = nil;
if let data = (NSURLConnection.sendSynchronousRequest(urlRequest, returningResponse: response, error: error) as NSData?) {
if let img = UIImage(data: data){
let filePath = NSURL.documentsFolder().URLByAppendingPathComponent("\(filePath)/\(mangaName)/\(chapter)/\(i)")
UIImagePNGRepresentation(img).writeToURL(filePath, atomically: true)
counter++
println("downloaded page number : \(i) and counter is : \(counter)")
//dispatch_async(dispatch_get_main_queue(), {
var downloaded = DownloadingManga()
downloaded.mangaName = mangaName
downloaded.chapterName = chapter
downloaded.progress = ((i + 1) * 100)/pagesList.count
downloaded.title = downloaded.mangaName + " " + downloaded.chapterName + " İndirilen : \(downloaded.progress)"
let notification = NSNotification(name: "downloadedNotification", object: DownloadHandler.self, userInfo: ["downloading" : downloaded])
var downque = DownloadingQueueViewController()
NSNotificationCenter.defaultCenter().postNotification(notification)
//})
}
}else{
}
}else{
if userDefaults.boolForKey("isApplicationActive"){
//bağlantı koptu bildirilmeli ve indirmeler durdurulmalı
println("bağlantı koptu kontrol et")
}
//dispatch_async(dispatch_get_main_queue(), {
let notification = UILocalNotification()
notification.fireDate = NSDate(timeIntervalSinceNow: 1)
notification.timeZone = NSCalendar.currentCalendar().timeZone
notification.alertBody = "Bölüm İndirilirken Bağlantı Koptu. İndirme Tamamlanamadı! :("
notification.hasAction = true
notification.alertAction = "View"
notification.userInfo = [:]
UIApplication.sharedApplication().scheduleLocalNotification(notification)
//})
break
}
if counter == pagesList.count {
succeed = true
println("succeed = \(succeed)")
}else{
succeed = false
println("succeed = \(succeed)")
}
}
if succeed {
if !self.isContaining(mangaName){
var encodedObject : NSData? = userDefaults.objectForKey("indirilenlerList") as? NSData
var tempIndList = NSKeyedUnarchiver.unarchiveObjectWithData(encodedObject!) as! [Manga]
var manga = Manga()
manga.name = mangaName
tempIndList.insert(manga, atIndex: 0)
var updatedTempIndList = NSKeyedArchiver.archivedDataWithRootObject(tempIndList)
userDefaults.setObject(updatedTempIndList, forKey: "indirilenlerList")
}
if userDefaults.boolForKey("isApplicationActive"){
}else{
//dispatch_async(dispatch_get_main_queue(), {
let notification = UILocalNotification()
notification.fireDate = NSDate(timeIntervalSinceNow: 1)
notification.timeZone = NSCalendar.currentCalendar().timeZone
notification.alertBody = "Bölüm İndirildi :) : Belgeler/\(mangaName)/\(chapter)/! Tıkla, Hemen Oku!"
notification.hasAction = true
notification.alertAction = "View"
notification.applicationIconBadgeNumber++
notification.userInfo = [
"MangaName" : mangaName,
"Chapter" : chapter
]
UIApplication.sharedApplication().scheduleLocalNotification(notification)
//})
}
}
}
}
println("async download method has came to the end!!!!!!!!!")
//})
}
func createDirectory(mangaName : String, chapter : String){
var filePath1 : String = "Turk Isi Manga"
// before create a new file path check it whether exist
let filePath = NSURL.documentsFolder().URLByAppendingPathComponent("\(filePath1)/\(mangaName)/\(chapter)")
var error:NSError?
let fileManager = NSFileManager()
if fileManager.createDirectoryAtURL(filePath, withIntermediateDirectories: true, attributes: nil, error: nil){
println("succeed to create the directory")
var fileError : NSErrorPointer = nil
filePath.setResourceValue(NSNumber(bool: true), forKey: NSURLIsExcludedFromBackupKey, error: fileError)
}else {
println("failed to create the directory")
}
}
func isContaining(name : String) -> Bool {
let userDefaults = NSUserDefaults.standardUserDefaults()
var encodedObject : NSData? = userDefaults.objectForKey("indirilenlerList") as? NSData
var tempIndList = NSKeyedUnarchiver.unarchiveObjectWithData(encodedObject!) as! [Manga]
var returnValue = false
for manga in tempIndList {
if manga.name == name {
returnValue = true
}
}
return returnValue
}
这是一个有点长的代码,但任何帮助将不胜感激,谢谢...编辑:仅当我点击 ui 警报 Controller 操作按钮“Bölümü İndir”时才会出现问题。因为所有背景的东西都是从那个 Action 中调用的。所有其他代码都可以视为上下文。我认为这与下载章节方法有关...
最佳答案
问题出在下载章节。我对这里发生的事情的猜测是 query.findObjectsInBackgroundWithBlock 调用主线程上的完成 block ,然后你正在执行 nsurlconnection 同步调用,这意味着它们会阻塞直到完成。
所以,如果你希望它是异步的,你需要在查询完成内部再次调度到后台线程。此外,您可能需要考虑使用 NSURLSession 而不是 NSURLConnection。
关于iOS swift后台线程阻塞主线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32569610/
IO 设备如何知道属于它的内存中的值在memory mapped IO 中发生了变化? ? 例如,假设内存地址 0 专用于保存 VGA 设备的背景颜色。当我们更改 memory[0] 中的值时,VGA
我目前正在开发一个使用Facebook sdk登录(通过FBLoginView)的iOS应用。 一切正常,除了那些拥有较旧版本的facebook的人。 当他们按下“使用Facebook登录”按钮时,他
假设我有: this - is an - example - with some - dashesNSRange将使用`rangeOfString:@“-”拾取“-”的第一个实例,但是如果我只想要最后
Card.io SDK提供以下详细信息: 卡号,有效期,月份,年份,CVV和邮政编码。 如何从此SDK获取国家名称。 - (void)userDidProvideCreditCardInfo:(Car
iOS 应用程序如何从网络服务下载图片并在安装过程中将它们安装到用户的 iOS 设备上?可能吗? 最佳答案 您无法控制应用在用户设备上的安装,因此无法在安装过程中下载其他数据。 只需在安装后首次启动应
我曾经开发过一款企业版 iOS 产品,我们公司曾将其出售给大型企业,供他们的员工使用。 该应用程序通过 AppStore 提供,企业用户获得了公司特定的配置文件(包含应用程序配置文件)以启用他们有权使
我正在尝试将 Card.io SDK 集成到我的 iOS 应用程序中。我想为 CardIO ui 做一个简单的本地化,如更改取消按钮标题或“在此保留信用卡”提示文本。 我在 github 上找到了这个
我正在使用 CardIOView 和 CardIOViewDelegate 类,没有可以设置为 YES 的 BOOL 来扫描 collectCardholderName。我可以看到它在 CardIOP
我有一个集成了通话工具包的 voip 应用程序。每次我从我的 voip 应用程序调用时,都会在 native 电话应用程序中创建一个新的最近通话记录。我在 voip 应用程序中也有自定义联系人(电话应
iOS 应用程序如何知道应用程序打开时屏幕上是否已经有键盘?应用程序运行后,它可以接收键盘显示/隐藏通知。但是,如果应用程序在分屏模式下作为辅助应用程序打开,而主应用程序已经显示键盘,则辅助应用程序不
我在模拟器中收到以下错误: ImageIO: CGImageReadSessionGetCachedImageBlockData *** CGImageReadSessionGetCachedIm
如 Apple 文档所示,可以通过 EAAccessory Framework 与经过认证的配件(由 Apple 认证)进行通信。但是我有点困惑,因为一些帖子告诉我它也可以通过 CoreBluetoo
尽管现在的调试器已经很不错了,但有时找出应用程序中正在发生的事情的最好方法仍然是古老的 NSLog。当您连接到计算机时,这样做很容易; Xcode 会帮助弹出日志查看器面板,然后就可以了。当您不在办公
在我的 iOS 应用程序中,我定义了一些兴趣点。其中一些有一个 Kontakt.io 信标的名称,它绑定(bind)到一个特定的 PoI(我的意思是通常贴在信标标签上的名称)。现在我想在附近发现信标,
我正在为警报提示创建一个 trigger.io 插件。尝试从警报提示返回数据。这是我的代码: // Prompt + (void)show_prompt:(ForgeTask*)task{
您好,我是 Apple iOS 的新手。我阅读并搜索了很多关于推送通知的文章,但我没有发现任何关于 APNS 从 io4 到 ios 6 的新更新的信息。任何人都可以向我提供 APNS 如何在 ios
UITabBar 的高度似乎在 iOS 7 和 8/9/10/11 之间发生了变化。我发布这个问题是为了让其他人轻松找到答案。 那么:在 iPhone 和 iPad 上的 iOS 8/9/10/11
我想我可以针对不同的 iOS 版本使用不同的 Storyboard。 由于 UI 的差异,我将创建下一个 Storyboard: Main_iPhone.storyboard Main_iPad.st
我正在写一些东西,我将使用设备的 iTunes 库中的一部分音轨来覆盖 2 个视频的组合,例如: AVMutableComposition* mixComposition = [[AVMutableC
我创建了一个简单的 iOS 程序,可以顺利编译并在 iPad 模拟器上运行良好。当我告诉 XCode 4 使用我连接的 iPad 设备时,无法编译相同的程序。问题似乎是当我尝试使用附加的 iPad 时
我是一名优秀的程序员,十分优秀!