标签: grand-central-dispatch

目标C - 阻止问题?

我有以下方法

+ (NSString*)getMeMyString
{
   NSString *result;
   dispatch_async(dispatch_get_main_queue(), ^{
        result = [ClassNotThreadSafe getString];
    });
   return result;
}
Run Code Online (Sandbox Code Playgroud)

如何让块同步执行它的工作,以便它在返回之前不返回结果?

objective-c grand-central-dispatch objective-c-blocks

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

iOS - 当线程(使用GCD)结束它的工作时如何通知

我开始使用GCD了,我需要知道某个线程何时结束了它的工作.

我的代码:

dispatch_queue_t registerDeviceQueue = dispatch_queue_create("RegisterDevice", NULL);
dispatch_async(registerDeviceQueue, ^{
    [self registerDevice];

    dispatch_async(dispatch_get_main_queue(), ^{
        [aiRegisterDevice stopAnimating];
    });
});
dispatch_release(registerDeviceQueue);
Run Code Online (Sandbox Code Playgroud)

我需要知道这个步骤何时结束,以便UIActivityView可以停止.它现在的方式,它在线程结束前停止.

谢谢,

RL

multithreading objective-c nsthread grand-central-dispatch

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

UIImage imageWithData需要一些时间才能出现

我有一个典型的"向下钻取"风格的应用程序DetailViewController包括UIImageView,UIWebView和一些UILabel秒.问题是imageView加载需要一段时间!它是白色(背景颜色)片刻,然后最终在3-5秒后加载(可能是下载所需的时间).

代码是:

- (void)loadSummary {
    self.dogFood = [[IKFetcher sharedFetcher] fetchDogFoodInfoForId:self.dogFoodId];
    self.dogFoodAnalysisArray = [[IKFetcher sharedFetcher] fetchDogFoodAnalysisArrayForId:self.dogFoodId];
    self.dogFoodRating = [[IKFetcher sharedFetcher] getAvgDogFoodRatingForId:self.dogFoodId];
    if ([self.dogFood.dfImageUrl length] != 0) {
        self.dogFoodImage.image = [UIImage imageWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:self.dogFood.dfImageUrl]]];
    }
}
Run Code Online (Sandbox Code Playgroud)

并且呼叫loadSummary包含在dispatch_async呼叫中.

我该怎么做才能让应用程序等待图像下载?

iphone objective-c uiimageview grand-central-dispatch ios

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

无法编译使用GCD函数调用

我正在尝试编译Desktop OS X Cocoa应用程序:

dispatch_sync(dispatch_get_main_queue(), ^{ NSLog(@"Hello World"); });
Run Code Online (Sandbox Code Playgroud)

但是,我收到以下编译时错误:

函数dispatch_sync的隐式声明

我已导入这些行:

#import <dispatch/dispatch.h>
#import <dispatch/queue.h>
#import <dispatch/base.h>
Run Code Online (Sandbox Code Playgroud)

Base SDK设置为10.6.还有什么需要寻找的吗?我错过了一个导入?

有任何想法吗?

macos cocoa grand-central-dispatch

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

如何下载JSON数据并在iOS中的后台线程中处理它?

我需要下载JSON并在iOS5的后台处理它,所以我不冻结我的主线程.我没有取得任何成功.

这是我在做的事情:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0),^{

    NSURL *url = [NSURL URLWithString:myURL];
    myData = [NSData dataWithContentsOfURL:url];

    [self performSelectorOnMainThread:@selector(processTheData:)
                           withObject:myData
                        waitUntilDone:YES];
}); 

-(void)processTheData:(NSData *)data
{
    //Parse JSON here
}
Run Code Online (Sandbox Code Playgroud)

在上面的代码中,一旦下载完成,我在Main thrd处理它.当我知道我得到数据时,如何在后台运行它?

multithreading grand-central-dispatch ios

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

UITableView insertRowsAtIndexPaths:WithRowAnimation没有冻结UI

我尝试理解UITableView当表格可见时,当我处理大量行时要使用的最佳实践.

这是我的行为:

我有一个UITableView和一个线程试图将数据插入此表.我认为[UITableView reloadData]对于性能方面做一个糟糕的解决方案,我知道UIKit操作是在主线程上进行的,因此当数据源更新完成时我试图发送一个NSNotification进行UITableView更新操作(beginUpdate - insertRowAtIndex - endUpdate)在主线程上,但这种技术冻结了用户界面.我必须处理1000多行.

有人已经解决了这个问题吗?是否可以使用GDC异步和同步?如果有,怎么样?提前致谢.

multithreading objective-c uitableview grand-central-dispatch ios

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

定时器不重复(Grand Central Dispatch)

我正在尝试学习如何在后台线程上调度计算,然后更新UI.当我在使用谷歌地图的现有项目中尝试此操作时,"背景"后跟"主"打印一次.不再进行打印,就好像计时器不重复一样.

此外,当我创建一个空白的应用程序并添加此代码时,根本没有任何打印.

let queue = dispatch_queue_create("myTimer", nil);
let timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, queue);
dispatch_source_set_timer(timer, DISPATCH_TIME_NOW, 1 * NSEC_PER_SEC, 1 * NSEC_PER_SEC);

dispatch_source_set_event_handler(timer) {
    println("background")
    dispatch_async(dispatch_get_main_queue(), { println("main") })
}

dispatch_resume(timer)
Run Code Online (Sandbox Code Playgroud)

xcode nstimer grand-central-dispatch ios swift

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

使用dispatch_async时EXC_BAD_ACCESS

我们最近修改了我们的线程机制,支持dispatch_async在大多数地方使用'(在做了很多关于NSOperation和dispatch_async的阅读之后)*.然后我们的代码开始在代码的各个部分与EXC_BAD_ACCESS崩溃,总是在dispatch_async(queue,...)部分,没有明确的模式.通常在20分钟后发生--2小时.

我们的dispatch_async块用于通知听众,如下所示:

NSMutableSet *_listeners; // Initialised elsewhere and filled with interested listeners
void(^block)(id listener); // Block to execute

@synchronized(_listeners) {
  for (id listener in _listeners) {
    dispatch_async_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); // We used different queues for different listeners, but showing only one type of queue here for brevity
    dispatch_async(queue, ^{ // CRASHING LINE
      block(listener);
    });
  }
}
Run Code Online (Sandbox Code Playgroud)

常见的症状是:

  • 发生在iOS10上,从未在iOS8上发生过
  • 在调试期间发生但从未报告过生产

(这是一个自我回答的问题)

*我们喜欢简单dispatch_async,不需要阻止/依赖功能,NSOperationQueue我们很快就会转向C++,所以想保持低水平.

exc-bad-access dispatch grand-central-dispatch ios dispatch-async

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

concurrentPerform在向数组添加值时出现UnsafeMutablePointer.deinitialize错误

我在向数组添加值时发生concurrentPerform错误.我按下按钮.在出错的那一刻,myArray01有133个.在其他运行中,myArray01有69个元素.如何删除此错误?

出错线

线程8:EXC_BAD_INSTRUCTION(代码= EXC_I386_INVOP,子代码= 0x0)

在控制台

致命错误:UnsafeMutablePointer.deinitialize with negative count 2017-12-24 11:59:53.438933 + 0300 ap02 [7624:1873749]致命错误:UnsafeMutablePointer.deinitialize with negative count(lldb)

类似主题Swift:UnsafeMutablePointer.deinitialize在附加到数组 Swift时带有负数的致命错误:UnsafeMutablePointer.deinitialize在附加到数组时带有负数的致命错误

var myArray01 = [4444,5555]

@IBAction func button01Pressed(_ sender: Any) {
    self.doIt01()
}

func doIt01() {
    DispatchQueue.concurrentPerform(iterations: 1000) { iter in
        var max = 100000
        for iterB in 0..<100000 {
            var k = 0
            k = k + 1
            var half:Int = max/2
            if (iterB == half) {
                myArray01.append(iter)
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

grand-central-dispatch ios

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

主队列上异步任务的执行顺序

在下面的代码中,print语句按它们包含的数字的顺序执行(1,2,3等)

override func viewDidLoad() {
    super.viewDidLoad()

    DispatchQueue.main.async {
        print("4")
    }

    print("1")
}

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)

    DispatchQueue.main.async {
        print("5")
    }

    print("2")
}

override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)

    DispatchQueue.main.async {
        print("6")
    }

    print("3")
}
Run Code Online (Sandbox Code Playgroud)

你能解释为什么执行过程会这样发生吗?是viewWillAppearviewWillAppear方法已经在队列中,当我们派遣异步块中viewDidLoad

grand-central-dispatch ios swift

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