いつもやり方を忘れてしまうのでメモ
Javaでメソッドの引数にリスナーを渡す
HogeConnection.java
private SearchWebListener searchWebListener;
public void searchWeb(String searchText, SearchWebListener _searchWebListener) {
searchWebListener = _searchWebListener;
// 時間がかかる処理を非同期で //
searchWebListener.didFinish(CONNECTION_NO_ERROR, resultList);
}
public interface SearchWebListener {
public void didFinish(int err, List<HogeSearchResultData> resultList);
}
呼び出し側
Hoge.java
HogeConnection hogeConnection = new HogeConnection();
hogeConnection.searchWeb(searchText, new HogeConnection.SearchWebListener()
@Override
public void didFinish(int err, List<HogeSearchResultData> _resultList) {
if (err == HogeConnection.CONNECTION_NO_ERROR) {
}
// エラーの時の処理
else {
}
}
});
または
Hoge.java
public void hogeMain() {
HogeConnection hogeConnection = new HogeConnection();
hogeConnection.searchWeb(searchText, new MySearchWebListener());
}
public class MySearchWebListener implements HogeConnection.SearchWebListene{
@Override
public void didFinish(int err, List<HogeSearchResultData> _resultList) {
if (err == HogeConnection.CONNECTION_NO_ERROR) {
}
// エラーの時の処理
else {
}
}
}
またはHoge.javaにHogeConnection.SearchWebListeneをimplementsしてもいい
Objective-CでBlocksを使う
typedef void (^TestMethodBlock)(BOOL arg1, BOOL arg2);
- (void)testMethodWithCompletion:(TestMethodBlock)_completion {
TestMethodBlock completion = [_completion copy];
// 別スレッド
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0),^{
/// 時間のかかる処理 ///
// メインスレッド
dispatch_sync(dispatch_get_main_queue(), ^{
completion(YES, YES);
});
});
}
呼び出
[self testMethodWithCompletion:^(BOOL arg1, BOOL arg2) {
}];
Objective-Cでdelegateを使った方法
HogeDelegate.h
@protocol HogeDelegate <NSObject>
- (void)didFinish:(NSArray*)_resultList;
@end
HogeConnection.h
#import <UIKit/UIKit.h>
#import "HogeDelegate.h"
@interface HogeConnection : NSObject
@property (nonatomic, weak) id<HogeDelegate> delegate;
- (void)connection;
@end
HogeConnection.m
#import "HogeConnection.h"
@implementation HogeConnection
@synthesize delegate = _ delegate;
- (void)connection {
// 別スレッド 時間がかかる処理
[delegate didFinish:resultList];
}
@end
呼び出し側
HogeClass.h
#import <UIKit/UIKit.h>
#import "HogeConnection.h"
@interface HogeClass. : NSObject<HogeDelegate>
@end
HogeClass.m
- (void)hogeMain {
HogeConnection hogeConnection = [HogeConnection alloc];
hogeConnection.delegate = self;
[hogeConnection connection];
}
#pragma mark - hogeConnection delegate
- (void)didFinish:(NSArray*)_resultList {
}