我的应用程序需要在加载tableview之前从服务器获取数据.如何使用dispatch_async在完成提取数据后使应用程序更新单元格视图.
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell
{
let cell = myTable.dequeueReusableCellWithIdentifier("editCell") as! EditTableViewCell
cell.answerText.text = dictPicker[indexPath.row]![dictAnswer[indexPath.row]!]
cell.questionView.text = listQuestion1[indexPath.row]
cell.pickerDataSource = dictPicker[indexPath.row]!
dictAnswer[indexPath.row] = cell.pickerValue
cell.answerText.addTarget(self, action: #selector(AddFollowUpViewController.textFieldDidChange(_:)), forControlEvents: UIControlEvents.EditingDidEnd)
cell.answerText.tag = indexPath.row
cell.identifier = true
return cell
}
Run Code Online (Sandbox Code Playgroud)
当我习惯上面的代码,它给我一个错误:dictAnswer是零.dictAnswer从服务器获取.我认为原因是在dictAnswer获取之前更新了单元格.但我不知道如何使用dispatch_async.我希望有一些可以给我一个暗示.谢谢
我想知道dispatch_async在下面用'A'和'B'表示的方法之间有什么区别.
A
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
for (int i = 0; i < 10; i++)
{
// do something
}
});
Run Code Online (Sandbox Code Playgroud)
B
for (int i = 0; i < 10; i++)
{
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
// do something
});
}
Run Code Online (Sandbox Code Playgroud) iphone grand-central-dispatch ios objective-c-blocks dispatch-async
我在使用GCD的Objective-C中遇到以下问题我无法弄清楚:
我使用以下方法计算一些648个瓷砖的东西.首先处理瓦片的顺序由设置变量"pi"的一些算法给出.变量"loaded"在此上下文中是全局变量,从0开始并正确地上升到647.
不使用块时,一切都很完美.
while (loaded < [self.tiles count]) {
long pi = /* tricky way to calculate the position index to set */;
NSLog(@"loaded: %d", loaded);
// Do this in a separate thread
dispatch_async(loader, ^{
NSLog(@"loaded ->: %d", loaded);
[self.tiles[loaded] setPositionIndexTo:pi];
});
loaded++;
}
Run Code Online (Sandbox Code Playgroud)
问题:
我得到一个例外,因为该块试图访问self.tiles [648]!在Apple的块文档中,可以看出,在创建块时,块中的变量值被捕获,所以我不明白,这是怎么回事.我确实理解加载的变量实际上最终确实具有值648,这应该在不执行的情况下中止循环.其他一些奇怪的是,值0也从未在块中使用,但它从1开始.有时也可能看到块在有关加载值的循环之前,有时会错过值,或做两次.这是一些输出:
loaded ->: 612
loaded: 613
loaded ->: 613
loaded ->: 614
loaded: 614
loaded ->: 614
loaded: 615
loaded: 616
loaded ->: 615
loaded: 617
loaded ->: 617
Run Code Online (Sandbox Code Playgroud)
为什么以及如何实现这一目标?
感谢任何澄清,正如我认为Apple的文档明确指出的那样,当创建块时,应该捕获"已加载"的值而不再对块进行更改.
我正在同时从Web服务器下载多个图像,我的问题是它们彼此混淆了.
dispatch_async(dispatch_get_global_queue(0,0), ^{
NSData * data = [[NSData alloc] initWithContentsOfURL:[NSURL URLWithString:@"website.com"]];
if (data == nil)
return;
dispatch_async(dispatch_get_main_queue(), ^{
cell.imageView.image = [UIImage imageWithData:data];
});
});
Run Code Online (Sandbox Code Playgroud)
我得到了以下代码:从URL Objective C获取图像.
我该如何解决??还有什么办法可以加快下载速度吗?
//my_serial_queue is a serial_dispatch_queue
dispatch_async(my_serial_queue, ^{
//access a shared resource such as a bank account balance
[self changeBankAccountBalance];
});
Run Code Online (Sandbox Code Playgroud)
如果我提交100个访问并改变银行账户余额的任务,我理解串行队列将按顺序执行每个任务,但是在使用dispatch_async时这些任务是否也按顺序完成?
如果我异步提交到串行队列的任务#23需要很长时间才能完成怎么办?任务#24只在任务#23完成时启动,还是任务#24在任务#23完成之前启动?如果是这样,任务#24在启动其工作时是否有错误的银行账户余额,从而搞砸数据完整性?
谢谢!!
concurrency objective-c grand-central-dispatch ios dispatch-async
在AlamoFire获取请求中,我正在尝试更新我的进度条.像这样:
alamofireManager.request(.GET, urlPath, parameters: params).responseJSON{(request,response,JSON,error) in
...<code here>...
dispatch_async(dispatch_get_main_queue(), {
NSNotificationCenter.defaultCenter().postNotificationName(LoginVCHideSpinnerAndShowProgressBarName as String, object: self)
})
...<more code here>...
}
Run Code Online (Sandbox Code Playgroud)
由于某些原因,这需要几秒钟的时间来执行,如果我使用dispatch_sync该应用程序似乎只是卡在那一点,但UI不会冻结(活动指示器微调器继续).我还想指出,一旦应用程序点击此代码,它就会继续执行代码,就像它已被执行一样.然后在大约6秒后执行它,好像它没有在主线程上被调用一样.
我也只是尝试这样做而不是使用通知.
dispatch_async(dispatch_get_main_queue(), {
loginVC.progressBar.hidden = false
loginVC.indicator.hidden = true
loginVC.progressBar.setProgress(0.1, animated: true)
})
Run Code Online (Sandbox Code Playgroud)
这似乎比通知慢.
我很困惑为什么会发生这种情况,因为我告诉它在主线程中进行更新.我也很困惑为什么通知实际上要快一点.
uiprogressview nsnotification dispatch-async swift alamofire
我在我的应用程序中遵循以下周期
var maxIterations: Int = 0
func calculatePoint(cn: Complex) -> Int {
let threshold: Double = 2
var z: Complex = .init(re: 0, im: 0)
var z2: Complex = .init(re: 0, im: 0)
var iteration: Int = 0
repeat {
z2 = self.pow2ForComplex(cn: z)
z.re = z2.re + cn.re
z.im = z2.im + cn.im
iteration += 1
} while self.absForComplex(cn: z) <= threshold && iteration < self.maxIterations
return iteration
}
Run Code Online (Sandbox Code Playgroud)
并在循环执行期间显示彩虹轮。如何管理该应用仍在响应UI操作?注意:在循环运行时,我在代码的不同部分更新了NSProgressIndicator,该代码未更新(未显示进度)。我怀疑这与调度有关,但是我对此相当“绿色”。我非常感谢您的帮助。谢谢。
我创建了一个覆盖来运行,同时我向服务器运行异步数据抓取,这样用户就不会继续按下UI中的按钮,直到数据抓取完成.我已经将函数放入一个全局单例类中,并在传入bool时调用它来说明我是否要显示或隐藏.我可以让它显示,但我不能让它隐藏.这是代码:
class DataModel {
static let sharedInstance = DataModel()
func accessNetworkData(vc: UIViewController, params: [String:Any], wsURLPath: String, completion: @escaping (_ response: AnyObject) -> ()) {
DataModel.sharedInstance.toggleModalProgess(show: true)
// SHOW THE MODAL HERE ONCE THE DATA IS REQUESTED.
let url = URL(string: wsURLPath)!
let session = URLSession.shared
var request = URLRequest(url: url)
request.httpMethod = "POST"
do { request.httpBody = try JSONSerialization.data(withJSONObject: params, options: .prettyPrinted) } catch let error { print(error.localizedDescription) }
request.addValue("application/json", forHTTPHeaderField: "Content-Type")
request.addValue("application/json", forHTTPHeaderField: "Accept")
let task = session.dataTask(with: request …Run Code Online (Sandbox Code Playgroud) 我对编程很新,所以我有一个简单的问题.实际上,写作可以帮助我更快地识别问题.
无论如何,我有一个多个异步调用的应用程序,它们嵌套如下:
InstagramUnoficialAPI.shared.getUserId(from: username, success: { (userId) in
InstagramUnoficialAPI.shared.fetchRecentMedia(from: userId, success: { (data) in
InstagramUnoficialAPI.shared.parseMediaJSON(from: data, success: { (media) in
guard let items = media.items else { return }
self.sortMediaToCategories(media: items, success: {
print("success")
// Error Handlers
Run Code Online (Sandbox Code Playgroud)
看起来很可怕,但那不是重点.一旦我开始工作,我将调查Promise Kit.
我需要sortMediaToCategories等待完成然后重新加载我的集合视图.但是,在sortMediaToCategories我有另一个嵌套函数,它也是异步并且具有for循环.
func sortMediaToCategories(media items: [StoryData.Items],
success: @escaping (() -> Swift.Void),
failure: @escaping (() -> Swift.Void)) {
let group = DispatchGroup()
group.enter()
for item in items {
if item.media_type == 1 {
guard let url = URL(string: (item.image_versions2?.candidates?.first!.url)!) …Run Code Online (Sandbox Code Playgroud) 我点击了 10 次 Web 服务 url 并得到响应。我正在使用Alamofire和SwiftyJSON。这是我的控制器代码
class ViewController: UIViewController {
let dispatchGroup = DispatchGroup()
var weatherServiceURL = "http://samples.openweathermap.org/data/2.5/weather?q=London,uk&appid=b6907d289e10d714a6e88b30761fae22"
override func viewDidLoad() {
super.viewDidLoad()
start()
}
func start() {
weatherService()
dispatchGroup.notify(queue: .main) {
print("All services complete")
}
}
func weatherService() {
for i in 1...10 {
dispatchGroup.enter()
APIManager.apiGet(serviceName: self.weatherServiceURL, parameters: ["counter":i]) { (response:JSON?, error:NSError?, count:Int) in
if let error = error {
print(error.localizedDescription)
return
}
guard let response = response else { return }
print("\n\(response) \n\(count) …Run Code Online (Sandbox Code Playgroud) grand-central-dispatch ios dispatch-async swift dispatchworkitem
dispatch-async ×10
ios ×5
swift ×5
objective-c ×3
alamofire ×1
asynchronous ×1
concurrency ×1
dispatch ×1
image ×1
iphone ×1
singleton ×1
swift3 ×1