标签: dispatch-async

Swift如何dispatch_queue来更新tableview单元格

我的应用程序需要在加载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 swift

3
推荐指数
2
解决办法
4702
查看次数

disp语句中的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

2
推荐指数
1
解决办法
984
查看次数

为什么这个块在创建时不会捕获变量值

我在使用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的文档明确指出的那样,当创建块时,应该捕获"已加载"的值而不再对块进行更改.

objective-c objective-c-blocks dispatch-async

2
推荐指数
1
解决办法
957
查看次数

目标c中一次出现多个异步请求

我正在同时从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获取图像.

我该如何解决??还有什么办法可以加快下载速度吗?

asynchronous image objective-c ios dispatch-async

2
推荐指数
1
解决办法
2356
查看次数

串行调度队列如何保证资源保护?

//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

2
推荐指数
2
解决办法
1163
查看次数

在AlamoFire(异步)调用中,UIProgressView进度更新非常慢

在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

2
推荐指数
1
解决办法
2467
查看次数

长周期块应用

我在我的应用程序中遵循以下周期

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,该代码未更新(未显示进度)。我怀疑这与调度有关,但是我对此相当“绿色”。我非常感谢您的帮助。谢谢。

nsprogressindicator dispatch-async swift3

2
推荐指数
1
解决办法
593
查看次数

ios 10 +,Swift 3+ - 无法从Singleton实例中解除UIAlertController

我创建了一个覆盖来运行,同时我向服务器运行异步数据抓取,这样用户就不会继续按下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)

singleton ios dispatch-async swift uialertcontroller

2
推荐指数
1
解决办法
1431
查看次数

Swift中嵌套的异步调用

我对编程很新,所以我有一个简单的问题.实际上,写作可以帮助我更快地识别问题.

无论如何,我有一个多个异步调用的应用程序,它们嵌套如下:

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)

dispatch grand-central-dispatch dispatch-async swift

2
推荐指数
1
解决办法
1465
查看次数

swift 以串行顺序同步多个 Web 服务调用

我点击了 10 次 Web 服务 url 并得到响应。我正在使用AlamofireSwiftyJSON。这是我的控制器代码

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

2
推荐指数
1
解决办法
7548
查看次数