相关疑难解决方法(0)

Grand Central Dispatch(GCD)与performSelector - 需要更好的解释

我在我的应用程序中使用了GCD和performSelectorOnMainThread:waitUntilDone,并且倾向于认为它们是可互换的 - 也就是说,performSelectorOnMainThread:waitUntilDone是GCD C语法的Obj-C包装器.我一直在考虑这两个命令是等价的:

dispatch_sync(dispatch_get_main_queue(), ^{ [self doit:YES]; });


[self performSelectorOnMainThread:@selector(doit:) withObject:YES waitUntilDone:YES];
Run Code Online (Sandbox Code Playgroud)

我不对吗?也就是说,performSelector*命令与GCD命令有区别吗?我已经阅读了很多关于它们的文档,但还没有看到明确的答案.

iphone multithreading objective-c grand-central-dispatch ios

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

确保函数仅在主线程上运行

如何确保我的函数仅在主线程上运行?(它更新UI元素)
这样的函数被认为是"坏"吗?

-(void)updateSomethingOnMainThread {
    if ( ![[NSThread currentThread] isEqual:[NSThread mainThread]] )
        [self performSelectorOnMainThread:_cmd withObject:nil waitUntilDone:NO];
    else {
        // Do stuff on main thread
    }
}
Run Code Online (Sandbox Code Playgroud)

我这样写它是为了避免有第二个功能,最初我有这样的:

-(void)updateSomethingOnMainThread_real {
    // Do stuff on main thread
}

-(void)updateSomethingOnMainThread {
    [self performSelectorOnMainThread:@selector(updateSomethingOnMainThread_real) withObject:nil waitUntilDone:NO];
}
Run Code Online (Sandbox Code Playgroud)

iphone objective-c

11
推荐指数
3
解决办法
1万
查看次数

如何在iOS中的后台线程上绘制文本?

我需要在后台线程上绘制文本以将其保存为图像.

我正在做

UIGraphicsPushContext()
[NSString drawInRect:]
UIGraphicsPopContext()
Run Code Online (Sandbox Code Playgroud)

代码工作正常,但有时它在drawInRect中崩溃,当我也在同时绘制主线程时.

我尝试使用NSAttributedString,如下所示: UIStringDrawing方法似乎在iOS 6中不是线程安全的.但是[NSAttributedString drawInRect:]由于某种原因似乎没有在我的后台线程上呈现任何内容.主线程似乎工作正常.

我一直在考虑使用Core Text,但看起来Core Text也有类似的问题:CoreText在多个线程中运行时崩溃

是否有线程安全的方式来绘制文本?

更新: 如果我运行此代码,它几乎立即崩溃在drawInRect与EXC_BAD_ACCESS:

   dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{

      UIGraphicsBeginImageContextWithOptions(CGSizeMake(100, 100), NO, 0);
      UIFont* font = [UIFont systemFontOfSize:14.0f];

      for (int i = 0; i < 100000000; i++) {
         [@"hello" drawInRect:CGRectMake(0, 0, 100, 100) withFont:font];
      }

      UIGraphicsEndImageContext();
   });

   UIGraphicsBeginImageContextWithOptions(CGSizeMake(100, 100), NO, 0);
   UIFont* font = [UIFont systemFontOfSize:12.0f];

   for (int i = 0; i < 100000000; i++) {
      [@"hello" drawInRect:CGRectMake(0, 0, 100, 100) withFont:font];
   }

   UIGraphicsEndImageContext();
Run Code Online (Sandbox Code Playgroud)

如果我删除UIFont并只绘制没有字体的文本,它可以正常工作.

更新: 这似乎只在iOS …

multithreading uikit core-text ios

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

UIView的-drawRect:是否必须在主线程上调用?

是否-drawRect:必须在主线程上绘制UIView的方法,或者CADisplayLink 是否可以-setNeedsDisplay在不同的运行循环中调用自定义视图?

iphone uiview ios

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

setNeedsDisplay在后台线程上不起作用

setNeedsDisplay在一个新线程中调用该方法,但我没有看到我的视图中的任何更改.在调用setNeedsDisplay新主题后,我该怎么做才能看到我的所有更改?

multithreading objective-c ios setneedsdisplay

-4
推荐指数
1
解决办法
1154
查看次数