こんにちは私はサーバーとデータを交換するWebサービスベースのアプリを持っています。私は自分の仕事をしている専用のクラスを持っているので、メインビューコントローラーは実際には毎回ワーカーを呼び出します。NSURLConnectionDelegateであるため、ワーカー自体は接続がいつ終了したかを認識しています。ただし、作業が完了するたびにメインビューコントローラに通知する必要があります。ワーカーはメインビューコントローラーの代理人であるため、いつ作業を開始する必要があるかを認識しています。私を助けてください。
4 に答える
逆のことをする必要があります。
最初にワーカーオブジェクトをメインビューコントローラーのメンバーとして宣言し(そしてもちろん、それをプロパティにします)、次にメインビューコントローラーから呼び出すだけ[self.worker sendRequstToServer]
でリクエストを送信できます。
次に、メインView Controller内で、作業オブジェクトを初期化する場所に、を置くことを忘れないでくださいself = worker.delegate
。
3番目に、のようなワーカークラスでデリゲートメソッドを宣言し、ワーカーのメソッド-(void)webServiceCallFinished()
を呼び出し[self.delegate webServiceCallFinished]
ます-connectionDidFinishLoading()
(-parserDidEndDocument()
NSXMLParerを使用してxmlを解析している場合は、このメソッドを呼び出します) 。
最後に、メインビューコントローラーをワーカークラスのデリゲートとして宣言し、を実装し-webServiceCallFinished()
ます。
お役に立てれば。
あなたは2つの方法でそれを行うことができます:
アプローチ#1:
ユーザーローカル通知。メインクラスで、次の方法でLocalNotificationCenterにオブザーバーを追加します。
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(jobDone) name:@"WORKERJOBOVER" object:nil];
そして、ジョブが完了したときのワーカークラスで、セレクターを起動するための通知を投稿します。
[[NSNotificationCenter defaultCenter] postNotificationName:@"WORKERJOBOVER" object:nil];
アプローチ#2:
ワーカークラスのプロトコルを作成し、プロトコルにメソッドを追加して、ワーカーでジョブが実行されたときにデリゲートで呼び出すことができます。
WorkerClass.h
//WorkerClass.h
@protocol WorkerDelegate
@interface WorkerClass: NSObject
@property (nonatomic, assign) id<WorkerDelegate> delegate
- (void)JobInProcess;
@end
@protocol WorkerDelegate
- (void)MyJobIsDone;
@end
WorkerClass.m
//WorkerClass.m
@implementation WorkerClass
@synthesize delegate = _delegate;
- (void)JobInProcess
{
//When job over this will fire callback method in main class
[self.delegate MyJobIsDone];
}
MainClass.h
//MainClass.h
#import WorkerClass.h
@interface MainClass: NSObject <WorkerDelegate>
@end
MainClass.m
//MainClass.m
@implementation MainClass
- (void)MyJobIsDone
{
//Do whatever you like
}
@end
メインのViewControllerで、次viewDidLoad:
のように通知オブザーバーとして設定します[NSNotificationCenter defaultCenter]
。
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(webServiceContacted:) name:@"webServiceConnectionSuccessful" object:nil];
次に、データがサーバーと正常に交換されたら、ネットワーク完了ブロック内に通知を投稿します。
[[NSNotificationCenter defaultCenter] postNotificationName:@"webServiceConnectionSuccessful" object:nil];
そしてwebServiceContacted:
、次のようになります。
-(void)webServiceContacted:(NSNotification *)note
{
//do stuff here
}
メインのViewControllerからリッスンできるバックグラウンドワーカーからの通知を送信します
ビューで聞きたいときに次を追加します。
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(operationComplete:) name:@"operationComplete" object:nil];
バックグラウンドビューで、イベントが完了したことを通知します。
[[NSNotificationCenter defaultCenter] postNotificationName:@"operationComplete" object:nil];
最後に、オブザーバーを削除することを忘れないでください[[NSNotificationCenter defaultCenter] removeObserver:self];