iphone - 使用 NSIncation 在主线程上执行选择器

标签 iphone objective-c animation nsinvocation

我想在主线程上执行动画(因为 UIKit 对象不是线程安全的),但在某个单独的线程中准备它。我有(baAnimation - CABasicAnimation 是之前分配和初始化的):

SEL animationSelector = @selector(addAnimation:forKey:);
NSString *keyString = @"someViewAnimation";

NSInvocation *inv = [NSInvocation invocationWithMethodSignature:[workView.layer methodSignatureForSelector:animationSelector]];
[inv setTarget:workView.layer];
[inv setSelector:animationSelector];
[inv setArgument:baAnimation atIndex:2];
[inv setArgument:keyString atIndex:3];
[inv performSelectorOnMainThread:@selector(invoke) withObject:nil waitUntilDone:NO];

我得到:

*** +[NSCFString length]: unrecognized selector sent to class 0x1fb36a0

通话:

>     #0 0x020984e6 in objc_exception_throw
>     #1 0x01f7e8fb in +[NSObject doesNotRecognizeSelector:]
>     #2 0x01f15676 in ___forwarding___
>     #3 0x01ef16c2 in __forwarding_prep_0___
>     #4 0x01bb3c21 in -[CALayer addAnimation:forKey:]
>     #5 0x01ef172d in __invoking___
>     #6 0x01ef1618 in -[NSInvocation invoke]

但是[workView.layer addAnimation:baAnimation forKey:@"someViewAnimation"];工作正常。我做错了什么?

最佳答案

除了 [inv keepArguments](如 Chris Suter 提到的)之外,您还需要将参数作为指向底层内存的指针传递。引用 API:

“当参数值是对象时,将指针传递给应从中复制对象的变量(或内存):

NSArray *anArray;  
[invocation setArgument:&anArray atIndex:3];  

"

关于iphone - 使用 NSIncation 在主线程上执行选择器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2963933/

相关文章:

java - Java中是否有等效的TweenMax

iphone - 在 iPad 中的 iOs 7 iPhone 应用程序中实现 iAd 的正确方法

iphone - 为什么我不能在 Obj-C 中声明像 "newVariable"这样的变量?

iphone - NSDate 查找离今天最近的日期

objective-c - 给定进程 ID,确定进程是否是 Mac 上的窗口进程

objective-c - 仅从 Objective-C 中的 html 内容中提取文本

objective-c - 如何配置 xCode 4 以在不添加 '.mm' 文件的情况下编译 objective-c++

actionscript-3 - 方向键8方向图形动画

ios - React Native 中的原生 iOS View

javascript - 如何使用 popmotion pure 从关键帧旋转、平移和缩放矩形?