[英]performSelectorOnMainThread results in “unrecognized selector sent to instance”
[英]Compiler gives warning on performSelectorOnMainThread:@selector(delegateMethod)
我有一個包含一些Web服務功能的NSOperation。 NSOperation有一個委托,當操作結束時將被發送消息。
由於NSOperation生活在一個不同的線程上,我必須像這樣打電話:
[delegate performSelectorOnMainThread:@selector(getDealersIDSuccess:) withObject:result waitUntilDone:YES];
它工作正常,但它給了我一個警告:
警告:'-performSelectorOnMainThread:withObject:waitUntilDone:'在協議中找不到
我完全同意這個編譯器,它看到一個委托,它檢查協議,它沒有找到performSelector方法的聲明。
我的問題是:我可以通過以不同的方式撥打此電話來刪除警告嗎?
我的兩個猜測是我可以(1)編寫一個名為的方法
- (void) callDelegateMethodOnMainThred {
[delegate getDealersIDSuccess:result]
}
並通過performSelectorOnMainThread調用它,但我發現這個解決方案很麻煩,而且是一個額外的,難以閱讀的,在代表團之上。
第二個解決方案可能是將委托轉換為選擇器內部父類對象的類型,但這只是簡單的瘋狂而且違背了委托封裝模式。
我非常感謝能夠更好地理解語言的第三個解決方案:)
先感謝您。
編輯:添加委托聲明:
id <ISDealersIDDelegate> delegate;
我聲明我的代表是id。 委托它自己擴展UIViewController。
我可以看到聲明NSObject會起作用。
performSelectorOnMainThread:withObject:waitUntilDone:
方法在NSObject
類中聲明。 如果您的委托對象繼承自NSObject,則可以將其聲明為
NSObject<MyDelegateProtocol> *delegate;
因此編譯器將知道委托響應NSObject的方法,並且不會發出警告。
在委托或其他協議實現上調用performSelectorOnMainThread:甚至可能是更好的解決方案。 讓代理/接收者負責確定是否需要在主線程上執行操作。
[delegate performSelector:@selector(delegateAction:)
withObject:actionData];
代表實施
- (void)delegateAction:(NSData*)actionData
{
[self performSelectorOnMainThread:@selector(updateUIForAction:)
withObject:actionData
waitUntilDone:NO];
}
- (void)updateUIForAction:(NSData*)actionData
{
// Update your UI objects here
}
它可能看起來像更多的代碼,但現在責任在正確的地方
實際上在iOS 4上我更喜歡使用NSNotifications和Observers(帶有Blocks)來對主線程執行更新。
- (id)addObserverForName:(NSString *)name object:(id)obj queue:(NSOperationQueue *)queue usingBlock:(void (^)(NSNotification *))block
我在這里寫下了我的設計。
1)聲明您的委托的協議以擴展.h文件中的NSObject協議
@protocol YourDelegateProtocol <NSObject>
2)在你的電話中投射到NSObject
[(NSObject*)delegate performSelectorOnMainThread:@selector(getDealersIDSuccess:) withObject:result waitUntilDone:YES];
我絕對推薦數字(1)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.