簡體   English   中英

編譯器在performSelectorOnMainThread上發出警告:@selector(delegateMethod)

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM