0

是否無法獲得完成塊成功,然後從另一個方法接收數據?如何從objective-c中的另一個方法執行完成塊?

@property myCompletion; 

// I have first call listeners, i can't add this in to "createOrderWithsuccess" 

-(void)listeners { 
    [[SocketIOManager sharedInstance].socket on:@"someAction" callback:^(NSArray* data, SocketAckEmitter* ack) { 
     // data received 
     myCompletion(data); 

    }]; 

} 

// this will be called <del>first</del> later 
- (void)createOrderWithsuccess:^(NSArray *data) { 
    // but it has to wait then data will be received 
    myCompletion = success; 
} 

回答

0

這是一個有點難以明白你在找什麼,但這個可能吧。這是我如何處理完成回調,在我的應用程序:

@import Foundation; 

typedef void (^CompletionBlock)(NSArray *data); 

@interface TheClass() 

@property (nonatomic, copy) CompletionBlock *myCompletion; 

@end 

@implementation TheClass() 

// .... 


- (void) createOrderWithsuccess:(CompletionBlock)success { 
    _myCompletion = success; 
} 

-(void)listeners { 
    [[SocketIOManager sharedInstance].socket on:@"someAction" callback:^(NSArray* data, SocketAckEmitter* ack) { 
     // data received 
     _myCompletion(data); 

    }]; 
} 

// Alternatively, breaking possible retain cycles 
-(void)listeners { 
    __weak TheClass *weakSelf = self; 
    [[SocketIOManager sharedInstance].socket on:@"someAction" callback:^(NSArray* data, SocketAckEmitter* ack) { 
     // data received 
     if(weakSelf.myCompletion) weakSelf.myCompletion(data); 
    }]; 
} 

typedef應在.h文件,使這兩個類和一個叫createOrderWithsuccess:知道。

+0

不要開玩笑。我在這行上有'ERROR ** EXC_BAD_ACCESS(code = 1,address = 0xc)**'_myCompletion(data);' –

+0

你是不是先調用'createOrderWithSuccess:'?你可以在if語句中調用'_myCompletion(data)':if(_myCompletion)_myCompletion(data)'。 – Joakim

+0

謝謝,它的工作:)我需要添加'if(_myCompletion)_myCompletion(data)_myCompletion = nil;'?根據hanh answer.With'_myCompletion = nil'它只會工作一次。我無法設置_myCompletion = nil,因爲監聽器會多次調用。 –

0

如果我正確理解你的意圖,這個想法很好。呼叫者可以使用createOrderWithsuccess:方法作爲完成塊的setter。隨後,呼叫者呼叫listeners,瞭解到他們早先設置的塊將在成功時被調用。

這很好,但考慮幾件事情:(1)複製塊...

@property (nonatomic, copy) void (^myCompletion)(NSArray *); 

(1.5)的塊將被更好地命名爲「successHandler」或類似的東西,和特性都可被公開,所以你可以刪除createOrderWithsuccess:二傳手。

(2)既然你不知道,如果呼叫者已調用之前設置塊,檢查零(這是否則崩潰)

if (self.myCompletion) self.myCompletion(data); 

(3)零塊,你是通過後用它。如果塊引用該對象,則刪除它將打破保留週期。

if (self.myCompletion) self.myCompletion(data); 
self.myCompletion = nil; 
+0

「createOrderWithsuccess」的外觀應該如何? –

+0

正如我所建議的,如果該塊是一個屬性,您可以將其設爲公共屬性,並且呼叫者可以直接分配。如果你真的想把這個任務放在createWithSuccess中,那麼就是一行分配,就像你有這個任務一樣好。 – danh

相關問題