- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
试图了解我如何将一个任务安排在另一个任务之后,查看了 GCD 和 NSOperations,但两者似乎都处于与核心代码相去甚远的抽象状态;其中一部分在它自己的线程上执行!
我尝试了这段代码,这是我能找到的最明显的代码...
let date = NSDate()
print("getting Links \(date)")
let operationQueue: NSOperationQueue = NSOperationQueue.mainQueue()
let completionBlockOperation: NSBlockOperation = NSBlockOperation.init(
block: {
self.reportFini()
}
)
let workerBlockOperation:NSBlockOperation = NSBlockOperation.init(
block: {
self.getLinks()
}
)
completionBlockOperation.addDependency(workerBlockOperation)
operationQueue.addOperation(workerBlockOperation)
operationQueue.addOperation(completionBlockOperation)
现在 reportFini 几乎什么都不做 ...
func reportFini() {
let date = NSDate()
print("got Links \(date)")
}
但 getLinks 更复杂,使用 session ......简而言之它运行
let request = NSMutableURLRequest(URL: NSURL(string: "https://blah")!)
let session = NSURLSession.sharedSession()
request.HTTPMethod = "POST"
request.addValue("application/json",forHTTPHeaderField: "Content-Type")
request.addValue("path", forHTTPHeaderField: lePath)
request.addValue("settings", forHTTPHeaderField: "requested_visibility\": \"public\"}")
var nodeA:NSMutableDictionary? = ["path":lePath]
let nodeB:NSMutableDictionary? = ["requested_visibility":"public"]
nodeA!.setValue(nodeB, forKey: "settings")
do {
let jsonData = try NSJSONSerialization.dataWithJSONObject(nodeA!, options: [])
request.HTTPBody = jsonData
} catch {
completion(string: nil, error: error)
}
var string2Return = ""
var stringPath = ""
let task = session.dataTaskWithRequest(request, completionHandler: {data, response, error -> Void in
if let error = error {
completion(string: nil, error: error)
return
}
let strData = NSString(data: data!, encoding: NSUTF8StringEncoding)
print("Body: \(strData)\n\n")
do {
let jsonResult = try NSJSONSerialization.JSONObjectWithData(data!, options:NSJSONReadingOptions.MutableContainers);
self.jsonParser(jsonResult,field2file: "ignore")
if let stringPath = (self.parsedJson["url"] as? String) {
string2Return = stringPath
} else {
string2Return = (self.parsedJson["error_summary"] as? String)!
}
completion(string: string2Return, error: error)
} catch {
completion(string: nil, error: error)
}
})
task.resume()
现在,getLinks 和 reportFini 同时执行@;基本上获取链接在它自己的线程上消失!并立即返回...但是我需要/希望在完成时得到通知,因为我还有其他事情要做。
它变得更加复杂,因为我需要同时运行 10 个 session (获取 10 个链接),所以是并行的;并希望在他们全部完成时得到通知。
---更新---
尝试将我的 session 代码包含在 GCD 中
let workerQueue = dispatch_queue_create("getLinks", DISPATCH_QUEUE_CONCURRENT)
let getLinksGroup = dispatch_group_create()
dispatch_group_notify(getLinksGroup, dispatch_get_main_queue()) {
print("All Links Downloaded")
}
dispatch_group_enter(getLinksGroup)
dispatch_group_async(getLinksGroup, workerQueue) {
退出...
dispatch_group_leave(getLinksGroup)
不幸的是,它不起作用;因为我已经看到 session 启动了它们自己的线程,而且我几乎立即收到代码已完成的通知,显然在它实际完成 URL 数据下载任务之前。
打算尝试使用 KVO ...
最佳答案
设法解决这个问题;使用 GCD & KVO,但不管理 session ;管理计数器,而不是通过更改受监视的 KVO 值来引发触发器。一个好的解决方案,你告诉我。
public class SynchronizedInt<T> {
private var blob:Int = 0
private let accessQueue = dispatch_queue_create("SynchronizedIntAccess", DISPATCH_QUEUE_SERIAL)
public func pending(queue2go:T) {
dispatch_sync(self.accessQueue) {
self.blob = queue2go as! Int
}
}
public func fulfilled() -> Bool {
dispatch_sync(self.accessQueue) {
self.blob = self.blob - 1
}
if self.blob == 0 {
return true
} else {
return false
}
}
public func copy() -> Int {
return self.blob
}
}
我用它来跟踪启动的 session ,这样我就可以在它们全部完成时收到通知。我在完成 block 中跟踪完成,每个 block 检查它是否是最后一个。除此之外,我还使用了基于此处介绍的第一个 Swifty 解决方案的 KVO。
http://blog.scottlogic.com/2015/02/11/swift-kvo-alternatives.html
关于ios - 在 Swift 上安排一个接一个的任务但是使用 session ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35277402/
我们有一个接口服务为下游的系统提供数据服务,本来好好的大家都愉快地传递JSON,非常和谐。可最近有个新需求去对接一个很老的系统,这倒是不算啥,可这个老系统数据不是以JSON传递的而是以XML传递
我想完成这样的事情: results = [] for i in range(N): data = generate_data_slowly() res = tasks.process
如何安排 SSIS 每天在给定时间从文件中自动执行包? 最佳答案 你有几个选择,但我会给你一些让你快速启动和运行的东西...... 打开 SQL Server Management Studio 并连
我们有两个服务器 Azure 配置,运行由 Umbraco 提供支持的网站。当我们需要向Azure服务器添加新域时,我们修改配置文件,然后依次重新启动每台服务器。 理论上,因为我们永远不会同时重新启动
我给出了一个创建电子邮件 C# 控制台应用程序的任务,该应用程序的目标是批量运行。我对 C# 领域非常陌生,因此我不知道我的方向。此 C# 控制台应用程序将部署在服务器上,并期望根据服务器时间在特定时
我有一个控制台应用程序,运行时会执行一些操作,并使用docker生成它的镜像。现在,我想将其部署到Kubernetes并每小时运行一次,是否有可能在K8中完成? 我已经阅读了有关Cron作业的信息,但
这是我的 CronJob 规范的一部分: kind: CronJob spec: schedule: #{service.schedule} 对于特定环境,设置了 cron 作业,但我从不希望
我的任务是创建一个应用程序,该应用程序将每 (n) 分钟向选定的收件人发送一封电子邮件。它所在的应用程序的结构方式是通过回调 .main(args) 来重置自身。每当需要的时候。我的问题是,当我调用.
安排 Airflow Dag 使其仅在工作日运行的正确方法是什么?我已经尝试在 start_date 和 schedule_interval 表达式中都包含小时偏移量,但它仍然没有在所需的时间开始。
我有许多测试都安排了一些 TestFixtures,我发现我正在复制该安排代码很多。每个测试的前几行几乎相同。 有没有一种方法可以在所有测试中声明一个共享的 TestFixture,同时仍然在每个测试
我有一个问题,我正在创建一个应用程序,我想在系统与 azan 时间匹配时在后台播放 azan 文件,无论用户正在使用应用程序的任何屏幕,azan 都应该开始播放。 我在 Azan.java 中创建了一
在我没有重启我的手机之前一直在 toast ,但是在重启之后 broadcastreceiver2 没有收到并且没有任何反应。 我关注了http://stacktips.com/tutorials/a
自动将一个数据库表的表数据复制到另一个数据库表;当表格更新或按某个特定时间间隔更新时,安排 数据库MySQL;语言 PHP 我有两个数据库; A和B 数据库 A 包含一个表 USERS 我想将USER
我的 Android 应用程序将定期轮询服务器以检查数据。我希望无论用户与应用程序交互如何进行此轮询,类似于(在概念上)Gmail 和 Google Reader 应用程序如何在后台同步数据。安装应用
我可以将android中的警报管理器(.set()方法)安排到当前时间一个月后的时间吗它会活那么久吗?操作系统对此 alarmManager 有何影响? 最佳答案 用户重启手机时的提示。您可以使用以下
安排 AsyncTask 每分钟运行一次的最佳做法是什么(请注意,在 AsyncTask 完成后我应该能够更新 UI)。 我不打算使用服务,因为这些任务应该只在应用处于 Activity 状态时运行。
我在排列从 php 中的 while 循环返回的数据时遇到问题。 基本上,我正在尝试从数据库返回工作的时间段计划,问题是我似乎在所有时间段中得到相同的结果,或者在一个时间段中的所有客户端得到相同的结果
我想创建一个仅在周六和周四运行的 mysql 事件。 是否可以定义事件本身的日期? 我有一个想法,每天运行调度程序,如果是星期四或星期六,则该过程将继续,否则它将退出调度程序而不执行任何操作。 最佳答
如何使用 MySQL 调度程序安排查询运行(如果这是最好的方法)?我按照 link here 中的说明进行操作但我有点迷路了。 我想在我们拥有的特定数据库上每 30 分钟运行一次以下查询。 u
我想在使用事件轮换我的日志后读取我的表日志,我希望我的事件在我选择的一周中的任何一天运行。 经过一番研究,我想到了这个 CREATE EVENT read_rotated_logs ON SCHEDU
我是一名优秀的程序员,十分优秀!