我是一个iOS新手.我有一个选择器方法如下 -
- (void) fooFirstInput:(NSString*) first secondInput:(NSString*) second
{
}
Run Code Online (Sandbox Code Playgroud)
我正在尝试实现这样的东西 -
[self performSelector:@selector(fooFirstInput:secondInput:) withObject:@"first" withObject:@"second" afterDelay:15.0];
Run Code Online (Sandbox Code Playgroud)
但这给了我一个错误说 -
Instance method -performSelector:withObject:withObject:afterDelay: not found
Run Code Online (Sandbox Code Playgroud)
关于我缺少什么的任何想法?
我无法找到关于如何子类化为NSOperation
并发以及支持取消的良好文档.我阅读了Apple文档,但我无法找到"官方"示例.
这是我的源代码:
@synthesize isExecuting = _isExecuting;
@synthesize isFinished = _isFinished;
@synthesize isCancelled = _isCancelled;
- (BOOL)isConcurrent
{
return YES;
}
- (void)start
{
/* WHY SHOULD I PUT THIS ?
if (![NSThread isMainThread])
{
[self performSelectorOnMainThread:@selector(start) withObject:nil waitUntilDone:NO];
return;
}
*/
[self willChangeValueForKey:@"isExecuting"];
_isExecuting = YES;
[self didChangeValueForKey:@"isExecuting"];
if (_isCancelled == YES)
{
NSLog(@"** OPERATION CANCELED **");
}
else
{
NSLog(@"Operation started.");
sleep(1);
[self finish];
}
}
- (void)finish
{
NSLog(@"operationfinished.");
[self willChangeValueForKey:@"isExecuting"];
[self willChangeValueForKey:@"isFinished"];
_isExecuting = NO; …
Run Code Online (Sandbox Code Playgroud) Swift中没有这类performSelector
方法.那么如何在一个对象上调用一个方法,在运行时选择要调用的方法,而在编译时不知道?显然在Swift中也没有.@objc
NSInvocation
我知道在Swift中,你可以向类型发送任何方法(@objc
方法声明可见)AnyObject
,类似于id
Objective-C.但是,这仍然需要您在编译时对方法名称进行硬编码.有没有办法在运行时动态选择它?
我想UILabel
在2秒后改变我的文字.
我尝试将我UILabel
的文本设置为"文本",然后使用sleep(2)
并最终将文本更改为"另一个文本".
但sleep(2)
只冻结应用程序并设置"另一个文本"而不显示"A文本" 2秒.
如何显示"A text" 2秒然后显示"Another text"?
我想在另一个线程的主线程上执行一个选择器,但是选择器有多个参数,类似于:
-(void) doSomethingWith:(int) a b:(float)b c:(float)c d:(float)d e:(float)e {
//...
}
我怎样才能使用它performSelectorOnMainThread: withObject: waitUntilDone:
?
编辑
我想解释一下为什么我需要这个.
我在主线程上使用UIImageViews,并在另一个线程上对它们进行计算.我使用了很多计算,所以如果我在主线程上创建所有内容,那么应用程序就会滞后.我知道UI元素只能在主线程上操作,这就是为什么我希望它以这种方式工作,所以主线程可以听到没有滞后的触摸事件.
performSelector的返回值是什么:如果我传递一个返回基本类型(在对象上)的选择器,例如NSDateComponents上的'week'(将返回一个int)?
我想在此方法中的块中重新加载我的表数据:
import UIKit
import AssetsLibrary
class AlbumsTableViewController: UITableViewController {
var albums:ALAssetsGroup[] = []
func loadAlbums(){
let library = IAAssetsLibraryDefaultInstance
library.enumerateGroupsWithTypes(ALAssetsGroupType(ALAssetsGroupAll),
usingBlock: {(group, stop) in
if group {
self.albums.append(group)
}
else {
dispatch_async(dispatch_get_main_queue(), {
self.tableView.reloadData()
})
}
}, failureBlock: { (error:NSError!) in println("Problem loading albums: \(error)") })
}
override func viewDidLoad() {
super.viewDidLoad()
loadAlbums()
// Uncomment the following line to preserve selection between presentations
// self.clearsSelectionOnViewWillAppear = false
// Uncomment the following line to display an Edit button in the navigation …
Run Code Online (Sandbox Code Playgroud) 我需要一种保存方式来说:"iOS,我希望这个方法尽快执行,但不要在这个循环迭代中执行.最早在下一个,但请不要在这一个.谢谢."
现在我总是这样做:
[self performSelector:@selector(doSomethingInNextRunLoop) withObject:nil afterDelay:0];
[self doSomeOtherThings];
Run Code Online (Sandbox Code Playgroud)
假设-doSomeOtherThings
将始终执行
-doSomethingInNextRunLoop
.
文件说:
指定延迟0不一定会导致选择器立即执行.选择器仍在线程的运行循环中排队,并尽快执行.
所以基本上可能会发生这种方法被立即调用,好像我刚刚发送了一条直接消息,导致-doSomethingInNextRunLoop
之前被执行-doSomeOtherThings
?
我怎样才能确保它会被调用asap但是从来没有在同一个运行循环迭代中被调用?
澄清措辞:对于运行循环,我指的是主线程,以及所有方法必须返回的迭代,直到线程再次为新事件准备好.
各种performSelector:...
方法最多可以处理传递给指定选择器的两个参数.如果我需要传递三个或更多参数,我该怎么办?
ARC迁移工具在开始迁移之前拒绝接受此代码:
[self.delegate performSelector:@selector(overlayDismissed:) withObject:self afterDelay:0];
Run Code Online (Sandbox Code Playgroud)
委托被迫使用协议实现此方法,它应该工作正常:
@protocol OverlayDelegate <NSObject>
- (void)overlayDismissed:(Overlay*)overlay;
@end
@interface Overlay : UIImageView {
id<OverlayDelegate> delegate;
}
@property (nonatomic, assign) id<OverlayDelegate> delegate;
Run Code Online (Sandbox Code Playgroud)
ARC有什么问题?为什么它告诉我"没有已知的选择器实例方法'performSelector:withObject:afterDelay:'?
performselector ×10
ios ×5
objective-c ×4
iphone ×3
swift ×3
selector ×2
arguments ×1
cocoa ×1
cocoa-touch ×1
delegates ×1
ios8 ×1
ipad ×1
nsobject ×1
nsoperation ×1
wait ×1