0

我正在开发一个自定义键盘项目。在这个项目中,我有两个目标(应用程序和键盘目标)。现在我构建了一个类,负责处理两个目标的网络数据:

class FeedDataManager: URLManagerdelegate, ModelManagerDelegate {
//Class Variables....

func initForKeyboard() {
    self.mModelManager = ModelManager(aContext: self.managedObjectContext())
    self.mModelManager.delegate = self
    self.mModelManager.mDelegateHashString = hashString(self)

    self.mFeedsArray = Array<News>()
    mModelManager.getFeeds(&self.mFeedsArray)
    self.mURLManager = UrlManager()
    self.mURLManager.delegate = self
}

func initForApp() {
    self.mModelManager = ModelManager(aContext: self.managedObjectContext())
    self.mModelManager.delegate = self
    self.mModelManager.mDelegateHashString = hashString(self)

    let uuid: String? = UserDefaultsManager.sharedInstance.getObjectForKey("UUID") as? String
    self.mURLManager = UrlManager()
    self.mURLManager.delegate = self
    mURLManager.doGetLanguagesRequest()

    if uuid == nil {
        mURLManager.doRegistrationRequest()
    }
}

//MARK: - News Related Methods
func getNews() {
    self.mFeedsArray.removeAll(keepCapacity: false)
    self.mModelManager.getFeeds(&self.mFeedsArray)
    Logger.printLogToConsole(TAG, aMethodName: __FUNCTION__, aMessage: "Feeds Array Count: \(mFeedsArray.count)")
    self.mURLManager.doGetSourcesRequest()
}

func handleRequestResults(aActionCode: Int, aData: NSData? = nil) {
    if let val = aData {
        if aActionCode == KiboConstants.NetworkActionCodes.GET_NEWS_DONE {
            let currentTime: Double = NSDate().timeIntervalSince1970
            UserDefaultsManager.sharedInstance.setDouble(currentTime, aKey: KiboConstants.CommonStrings.USER_DEF_LAST_UPDATE_TIME_STAMP)
            var json: AnyObject! = NSJSONSerialization.JSONObjectWithData(aData!, options: .MutableContainers, error: nil)
            var nextUpdate: AnyObject? = json.valueForKey(KiboConstants.CommonStrings.USER_DEF_NEXT_UPDATE)
            self.setTimeWithNextUpdateValue(nextUpdate)
            self.mModelManager.updateNews(json, aCallerHashString: hashString(self))

        } else if aActionCode == KiboConstants.NetworkActionCodes.GET_SOURCES_DONE {
            var jsonWrapped: AnyObject! = NSJSONSerialization.JSONObjectWithData(aData!, options: .MutableContainers, error: nil)
            if self.mModelManager == nil {
                self.mModelManager = ModelManager(aContext: self.managedObjectContext())
                self.mModelManager.delegate = self
                self.mModelManager.mDelegateHashString = hashString(self)
            }
            if let json: AnyObject = jsonWrapped {
                mModelManager.updateSources(json)
            }
        } else if aActionCode == KiboConstants.NetworkActionCodes.GET_LANGUAGES_DONE {
            #if APPLICATION
            var json: AnyObject! = NSJSONSerialization.JSONObjectWithData(aData!, options: .MutableContainers, error: nil)
            if let val: AnyObject = json {
                let languages: AnyObject = json.objectForKey(KiboConstants.JsonKeys.JSON_KEY_DATA_LANGUAGES_LOWERCASE)!
                for item in languages as! Array<AnyObject> {
                    ApplicationLanguagesManager.sharedInstance.addLanguageToAvailableLanguagesArray(item)
                }
            }
            #endif
        }
    } else {
        self.setTimeWithNextUpdateValue(KiboConstants.UserDefaultsValues.DEFAULT_NEXT_NEWS_UPDATE_VAL)
    }
}
.....
}

如果您查看handleRequestResults方法,您将看到以下部分:

#if APPLICATION
var json: AnyObject! = NSJSONSerialization.JSONObjectWithData(aData!, options: .MutableContainers, error: nil)
if let val: AnyObject = json {
    let languages: AnyObject = json.objectForKey(KiboConstants.JsonKeys.JSON_KEY_DATA_LANGUAGES_LOWERCASE)!
    for item in languages as! Array<AnyObject> {
        ApplicationLanguagesManager.sharedInstance.addLanguageToAvailableLanguagesArray(item)
    }
}
#endif

在应用程序目标中,我在预处理器宏部分定义了以下内容:

在此处输入图像描述

现在,当我在调试中运行应用程序并使用“po APPLICATION”时,我得到了相关的打印,而在键盘扩展中,我得到了以下错误:error: <EXPR>:1:1: error: use of unresolved identifier 'APPLICATION'

意味着配置被正确读取。

问题/问题是:在应用程序的运行中,此代码仍未执行。有人知道为什么吗?我在这里想念什么?

4

3 回答 3

0

我的回答不正确 - 感谢 Emil Adz 让我知道。

在您使用的代码#if中,但您应该使用#ifdef.

#if评估APPLICATION,如果未在键盘扩展中定义,则应出现错误消息。

#ifdef检查,是否APPLICATION已定义。所以你很可能想要#ifdef APPLICATION而不是#if APPLICATION.

(自从我使用预处理器宏已经有一段时间了,但我希望我能正确地记住事情......)

于 2015-06-25T16:12:31.593 回答
0

雷纳的回答是正确的。

但是,您也可以尝试这样做。在您的应用程序目标中添加宏:

应用 = 1

并在您的键盘扩展中添加

应用 = 0

有了这个,您将能够毫无问题地使用您当前的代码。而且,作为一个额外的好处,您的键盘扩展不会抱怨它找不到 APPLICATION 的定义,而只会忽略代码。

任何一种方法都有效。

于 2015-06-25T16:26:38.680 回答
0

实际上,这里没有一个答案是正确的。我已经使用以下配置实现了我想要的:

plist 文件: plist 文件

并在代码中完成以下操作:

#if APPLICATION
        var json: AnyObject! = NSJSONSerialization.JSONObjectWithData(aData!, options: .MutableContainers, error: nil)
        if let val: AnyObject = json {
            let languages: AnyObject = json.objectForKey(KiboConstants.JsonKeys.JSON_KEY_DATA_LANGUAGES_LOWERCASE)!
            for item in languages as! Array<AnyObject> {
                ApplicationLanguagesManager.sharedInstance.addLanguageToAvailableLanguagesArray(item)
            }
        }
        #endif

结果是这部分代码仅针对具有APPLICATION标志的目标进行编译。

一个为我清除了一切的链接:使用 Swift 构建配置管理

于 2015-06-28T22:29:06.247 回答