zoukankan      html  css  js  c++  java
  • 用类封装协议以避免在程序中增加判断语句

    在使用FBConnect的FBDialog功能时,需要有一个FBLoginDialog和一个FBStreamDialog。然而FBDialog的Delegate只有一个,因此在FBLoginDialog和FBStreamDialog中各添加了一个布尔值变量以判断需执行哪个Dialog的操作。

    但是,该方法只能在两个Dialog的情况下可以使用,如果出现了两个以上的Dialog,则会使程序的结构变得极为复杂。

    因此,可以改为创造一个FBDialog类,该类实现 了FBDialogDelegate协议,再在程序中实现该Dialog类的两个对象,这样就可以使不同的FBDialog去调用各自的Callback而不会再产生冲突。而且修改成类的封装后使程序的灵活性大为提高,如果今后再需要增加Dialog的数量,只需再实现一个Dialog类的对象即可,而不用对原有程序做大幅的改动。

    FBDialogEventHandler.h:

    #import <Foundation/Foundation.h>
    #import "FBConnect/FBConnect.h"
    
    @interface FBDialogEventHandler : NSObject <FBDialogDelegate> {
    	id mTarget;
    	SEL mSucceedHandler;
    	SEL mCancelHandler;
    	SEL mErrorHandler;
    }
    
    @property (nonatomic, assign) SEL succeedHandler;
    @property (nonatomic, assign) SEL cancelHandler;
    @property (nonatomic, assign) SEL errorHandler;
    - (id)initWithTarget:(id)target;
    
    @end
    
    

    FBDialogEventHandler.m:

    #import "FBDialogEventHandler.h"
    
    @implementation FBDialogEventHandler
    
    @synthesize succeedHandler = mSucceedHandler;
    @synthesize cancelHandler = mCancelHandler;
    @synthesize errorHandler = mErrorHandler;
    
    - (id)initWithTarget:(id)target {
    	if (self = [super init]) {
    		mTarget = target;
    	}
    	return self;
    }
    
    - (void)dealloc {
    	[super dealloc];
    }
    
    #pragma mark -
    #pragma mark FBDialogDelegate
    - (void)dialogDidSucceed:(FBDialog*)dialog {
    	[mTarget performSelector:mSucceedHandler withObject:dialog];
    }
    
    - (void)dialogDidCancel:(FBDialog*)dialog {
    	[mTarget performSelector:mCancelHandler withObject:dialog];
    }
    
    - (void)dialog:(FBDialog*)dialog didFailWithError:(NSError*)error {
    	[mTarget performSelector:mErrorHandler withObject:error];
    }
    
    - (BOOL)dialog:(FBDialog*)dialog shouldOpenURLInExternalBrowser:(NSURL*)url {
    	return YES;
    }
    
    @end
    
    

    然后,在头文件中声明:

    - (void)loginDialogDidSucceed:(FBDialog *)dialog;
    - (void)loginDialogDidCancel:(FBDialog *)dialog;
    - (void)loginDialog:(FBDialog *)dialog didFailWithError:(NSError *)error;
    - (void)feedDialogDidSucceed:(FBDialog *)dialog;
    - (void)feedDialogDidCancel:(FBDialog *)dialog;
    - (void)feedDialog:(FBDialog *)dialog didFailWithError:(NSError *)error;
    
    

    再在程序中加入:

    		mFBLoginHandler = [[FBDialogEventHandler alloc] initWithTarget:self];
    		mFBLoginHandler.succeedHandler = @selector(loginDialogDidSucceed:);
    		mFBLoginHandler.cancelHandler = @selector(loginDialogDidCancel:);
    		mFBLoginHandler.errorHandler = @selector(loginDialog:didFailWithError:);
    		mFBPostFeedHandler = [[FBDialogEventHandler alloc] initWithTarget:self];
    		mFBPostFeedHandler.succeedHandler = @selector(feedDialogDidSucceed:);
    		mFBPostFeedHandler.cancelHandler = @selector(feedDialogDidCancel:);
    		mFBPostFeedHandler.errorHandler = @selector(feedDialog:didFailWithError:);
    
    
  • 相关阅读:
    正则式记录
    限制键盘只能按数字键、小键盘数字键、退格键
    windows服务安装记录
    CheckBox使用记录
    you need to be root to perform this command
    Code First 更新数据库 记录
    EF查询记录
    sqlserver数据库存储汉字出现?
    【转】THE ROAD TO SUCCESS--听ERIC XING讲课记录
    Nice Computer Vision package collections
  • 原文地址:https://www.cnblogs.com/eagley/p/1743465.html
Copyright © 2011-2022 走看看