小编The*_*ter的帖子

如何禁用Hibernate Search/Lucene中的默认评分/提升?

我想为我的用户提供最相关和最好的结果.例如,我奖励具有大标题,描述,附加照片等的记录.对于上下文:记录是自行车路线,具有路线点(坐标)和元数据,如照片,评论等.

现在,我使用了索引这些记录Hibernate,然后使用Lucenein 在索引中搜索Hibernate Search.为了对我的结果进行评分,我根据文档属性构建查询并在以下文件中提升它们(使用boostedTo())should BooleanJunction clause:

bj.should(qb.range().onField("descriptionLength").above(3000).createQuery()).boostedTo(3.0f);   
bj.should(qb.range().onField("views.views").above(5000).createQuery()).boostedTo(3.0f);     
bj.should(qb.range().onField("nameLength").above(20).createQuery()).boostedTo(1.0f);     
bj.should(qb.range().onField("picturesLength").above(0).createQuery()).boostedTo(5.0f);
bj.should(qb.keyword().onField("routePoints.poi.participant").matching("true").createQuery()).boostedTo(10.0f);
Run Code Online (Sandbox Code Playgroud)

要尝试禁用Lucene的评分,我已经覆盖了DefaultSimilarity该类,将所有比较设置为1.0f得分并通过Hibernate配置启用它:

public class IgnoreScoringSimilarity extends DefaultSimilarity {
    @Override
    public float idf(long docFreq, long numDocs) {
        return 1.0f;
    }

    @Override
    public float tf(float freq) {
        return 1.0f;
    }

    @Override
    public float coord(int overlap, int maxOverlap) {
        return 1.0f;
    }

    @Override
    public float lengthNorm(FieldInvertState state) {
        return 1.0f;
    }

    @Override
    public float queryNorm(float sumOfSquaredWeights) {
        return 1.0f;
    }
} …
Run Code Online (Sandbox Code Playgroud)

java lucene indexing hibernate hibernate-search

14
推荐指数
1
解决办法
1013
查看次数

XCode 9本地化导出/导入不包括NSLocalizedString()或注释

情况:

我们使用XCode导出/导入工具为我们的翻译生成可本地化的文件.这在XCode 8中运行良好.由于我们更新到XCode 9,我们发现了一些问题.

问题:

  1. 通过编辑器导出本地化 - >导出以进行本地化... - >仅限开发语言时,根据此文档,它不包含 NSLocalizedString()键/值:When you export localizations, Xcode searches your code for the macros and includes the strings files in the exported localization file for translation.
  2. 添加到Localizable.strings开发语言文件的注释似乎在导出.xliff文件中不存在.
  3. 导入翻译.xliff文件时,XCode似乎删除了文件中的所有注释.它被取代"(No Comment)"

组态:

  • XCode 9.0(9A235)
  • 开发语言:NL
  • 本地化语言:Base,NL,DE,BE,LU
  • Objective-C&Swift混合项目

我尝试过的:

  • 我曾尝试查看XCode 9文档或更改日志以查看本地化中发生的变化,但我无法找到提及此更改的内容
  • NSLocalizedString()当我第一次Localizable.strings手动生成开发文件时,我可以通过使用命令行命令将我的字符串显示在导出中find ./ -name "*.m" -print0 | xargs -0 xcrun extractLocStrings -o .(我为.swift文件运行第二次,因为我的项目是swift/objc混合).然后结合结果,让我的字符串显示在导出中,但没有注释,这是翻译人员的指南.

题:

这是一个XCode 9错误吗?我是否错过了本地化导出/导入的任何文档或新功能/选项?有变通方法吗?

xcode localization export nslocalizedstring ios

14
推荐指数
1
解决办法
1640
查看次数

如何从后台的伴侣手表应用程序启动主iOS应用程序?

情况:

由于我们的用户已将iOS更新为11和/或将WatchOS更新为4,因此当我们的WatchOS应用程序启动应用程序时,我们的iOS应用程序似乎不会触发任何预定的计时器.也许我们在从WatchOS应用程序启动主应用程序时做错了什么.

上下文和代码:

我们的WatchOS应用程序是一个配套应用程序,可让用户通过按下按钮在后台启动/停止我们的iPhone应用程序.我们这样做是通过使用:

func startMainApp() {
    guard WCSession.default().isReachable == true else {
        print("Watch is not reachable")
        return
    }

    var data = [String : AnyObject]()
    data[WatchActions.actionKey()] = NSNumber.init(value: WatchActions.startApp.rawValue as Int)

    WCSession.default().sendMessage(data, replyHandler: { (result: [String : Any]) in
        let resultNumber = result[WatchActions.resultKey()] as? NSNumber
        let resultBool = resultNumber!.boolValue
        if resultBool == true {
            self.setModeActivated()
        } else {
            self.setModeActivationFailed()
        }

    }) { (error: Error) in
        if (error as NSError).code != 7012 {
            print("start app error: \(error.localizedDescription)")
            self.setModeActivationFailed()
        }
    }
} …
Run Code Online (Sandbox Code Playgroud)

iphone ios swift watchos wcsession

12
推荐指数
1
解决办法
952
查看次数

UIImagePickerController允许编辑= YES,修剪后获得未修剪的视频

问题:

当我在UIImagePickerControllerallowEditing设置为YES的情况下录制视频,然后使用视频捕获后的trim-interface修剪视频时,我返回原始视频,而不是修剪过的视频.

建立:

我正在使用UIImagePickerController视频捕获,allowsEditing属性设置为YES.在delegate方法中didFinishPickingMediaWithInfo,我使用UIImagePickerControllerMediaURLinfo NSDictionary来获取路径URL.官方的Apple文档遗憾的是没有提到任何已修改的视频网址.

码:

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
{
    NSString *mediaType = [info objectForKey: UIImagePickerControllerMediaType];

    if (CFStringCompare ((__bridge CFStringRef) mediaType, kUTTypeMovie, 0)
        == kCFCompareEqualTo) {

        self.tempVideoPath = [[info objectForKey:
                                UIImagePickerControllerMediaURL] path];
    }
}
Run Code Online (Sandbox Code Playgroud)

我意识到这个问题类似于其他 的人在这里张贴在SO,但没有明确的答案,为什么它不工作或者为什么选择是即使在那里.如果它是这样的,我不明白为什么选择器有'allowsEditing'属性.

编辑:在我收到的信息词典中有以下键:

info: {
    UIImagePickerControllerMediaType = "public.movie";
    UIImagePickerControllerMediaURL = "file://localhost/private/var/mobile/Applications/F12E4608-FE5A-4EE3-B4E2-8F7D2508C4C8/tmp/capture-T0x21d810.tmp.wabFCC/capturedvideo.MOV";
    "_UIImagePickerControllerVideoEditingEnd" = "5.498333333333333";
    "_UIImagePickerControllerVideoEditingStart" = "4.273402690887451";
}
Run Code Online (Sandbox Code Playgroud)

这是否意味着我们必须自己修剪这些数据?那么Apple文档对此并不十分清楚.如果是这样,你知道一个好的做法吗?

iphone video uiimagepickercontroller ipad ios

11
推荐指数
1
解决办法
4362
查看次数

从后台返回后,UIWebView在iOS 7上更改contentSize

问题:

UIWebViewUINavigationBar和我之间有一个UITabBar.在iOS 7上,当应用程序进入后台并再次返回时,似乎更改的contentSize属性UIWebView使其上方有一个白色块.

监测后contentSizeUIWebView,当应用程序进入前景(我通过观察检查UIApplicationDidBecomeActiveNotification),它已经49中减去从它的高度.

截图(编辑敏感信息): 截图的编辑版本

我的设置:

我使用的是UIWebView在我的UIViewController嵌入在一个UITabBarViewController嵌入的UINavigationController.我正在使用故事板并具有"调整滚动视图插入","从NIB调整视图大小"和"在条形图下扩展边缘".在UIWebView我没有选中"Scales Page To Fit".我没有在viewDidAppearviewWillAppear方法中做任何事情.我在iOS 6上测试过它,问题不会发生在那里.另外,我没有使用自动布局.

相关守则:

self.webView.scrollView.scrollEnabled = NO;
self.webView.scrollView.bounces = NO;
self.webView.scalesPageToFit = NO;
Run Code Online (Sandbox Code Playgroud)

监测后contentSize和框在viewDidAppear&appHasGoneInForeground:

帧从320x455到320x455,contentSize从320x504变为320x455

有没有人知道我在这里缺少什么和/或为什么会这样?谢谢你的时间!

iphone objective-c uiwebview ios ios7

11
推荐指数
3
解决办法
1万
查看次数

为什么我的Java堆转储大小比使用的内存小得多?

问题

我们正试图在我们的Web应用程序中找到大内存泄漏的罪魁祸首.我们在查找内存泄漏方面经验非常有限,但我们发现如何jmap在Eclipse MAT中使用和分析它来进行Java堆转储.

但是,我们的应用程序使用56/60GB内存,堆转储的大小只有16GB,在Eclipse MAT中甚至更少.

上下文

我们的服务器在Ubuntu 14.04上使用Wildfly 8.2.0作为我们的Java应用程序,其进程使用95%的可用内存.进行转储时,我们的缓冲区/缓存已用空间为56GB.

我们使用以下命令创建转储: sudo -u {application user} jmap -dump:file=/mnt/heapdump/dump_prd.bin {pid}

堆转储文件大小为16,4GB,当使用Eclipse MAT进行分析时,它表示有大约1GB的活动对象和大约14,8GB的无法访问/浅堆.

编辑:这里有一些关于我们看到的问题的更多信息.我们监视内存使用情况,我们看到它的增长和增长,直到剩下大约300mb的可用内存.然后它保持在那个内存量附近,直到进程崩溃,不幸的是在应用程序日志中没有错误.

这使我们假设它是一个硬OOM错误,因为这只发生在内存接近耗尽时.我们使用-Xms25000m -Xmx40000mJVM 的设置.

基本上,我们想知道为什么我们的大部分内存都没有在这个转储中被捕获.顶部保留的大小类看起来并不太可疑,所以我们想知道是否存在与堆转储有关的问题我们做错了什么.

java memory-leaks heap-memory jmap heap-dump

11
推荐指数
2
解决办法
1万
查看次数

保存录制的视频太长时,应用程序崩溃

问题:

保存我的应用中记录的视频时,如果视频大小/持续时间太大/太长,我的应用程序崩溃时没有日志/异常.

我的设置:

在我的应用程序中,我使用UIImagePickerController来录制视频.现在我注意到如果我的视频长度非常长(例如使用UIImagePickerControllerQualityTypeMedium 30分钟,或使用UIImagePickerControllerQualityTypeIFrame1280x720超过一分钟),保存视频时应用程序崩溃.有时有,有时没有警告.现在我开始调试并注意到它与内存有关(malloc_error).

我使用分析器来实时检查分配,并注意到,当它要保存视频时,分配突然变得非常大(我想这与视频的临时内存使用情况有关?)在它最终崩溃之前.以下是分析器的屏幕截图: 分配截图

该应用必须能够录制最长1小时的视频(指定任何质量).

我尝试过的:

  • 将picker.videoMaximumDuration设置为更短/更长
  • 使用分析器/仪器进行调试
  • 检查是否有泄漏
  • 关闭所有打开的应用程序和已删除的应用程序设备(用于存储清理)以获得更多内存

码:

- (void)openCamera:(id)sender context:(NSManagedObjectContext*)context {
    self.context = context;
    //Set self as delegate (UIImagePickerControllerDelegate)
    [self.picker setDelegate:self];
    //If the device has a camera
    if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]) {
        self.picker.sourceType = UIImagePickerControllerSourceTypeCamera;
        self.picker.allowsEditing = YES;
        self.picker.videoQuality = [Settings videoQualitySetting];
        //If the camera can record video 
        NSString *desired = (NSString *)kUTTypeMovie;
        if ([[UIImagePickerController availableMediaTypesForSourceType:self.picker.sourceType] containsObject:desired]) {
            //Let the user record video
            self.picker.mediaTypes = [NSArray arrayWithObject:desired];
            self.picker.videoMaximumDuration = MaxDuration;
        }
        else {
            NSLog(@"Can't take …
Run Code Online (Sandbox Code Playgroud)

iphone crash uiimagepickercontroller ipad ios

6
推荐指数
1
解决办法
1702
查看次数

为什么我的NSMutableArray在某些索引上包含nil?

问题:

在我填充了一个NSMutableArray对象并尝试用它做某事之后,它包含(id)0x0了一些索引.我认为NSMutableArray在Objective-C中根本不可能添加nil 所以我想知道为什么会发生这种情况.

这是什么时候发生的?

不幸的是,"有时候".它可以通过下载超过5000个瓷砖来重现,只是为了获得足够高的金额以便发生这种情况.即使有超过5000个瓷砖,它有时也会完美无缺.

语境:

我的应用程序有一个按钮,可以开始下载特定区域的地图图块.下载在后台线程中并行发生,并为每个下载的磁贴报告.

为了允许取消下载,在我的下载器单例中,我有一个临时表NSMutableArray,可以保存每个下载的磁贴的哈希值.取消后,我可以使用该哈希列表删除数据库中的每个已保存的磁贴.

在下载过程中保存哈希似乎没问题,但是当我真的想要对它做任何事情时(我用[_currentTileHashes copy]它来改变它NSArray以给予删除方法),它会抛出NSInvalidArgumentException一行说:

-[__NSPlaceholderArray initWithObjects:count:]: attempt to insert nil object from objects[3402]
Run Code Online (Sandbox Code Playgroud)

当我使用调试器检查_currentTileHashes可变数组时,我确实看到一个或两个索引实际上是nil或(id)0x0.这个截图说明了它:

调试器在数组中显示nil

相关代码:

此代码来自每个tile下载的回调,它会散列磁贴,将其添加到hashes数组并回调UI以获取进度:

- (void)tileCache:(RMTileCache *)tileCache didBackgroundCacheTile:(RMTile)tile withIndex:(NSUInteger)tileIndex ofTotalTileCount:(NSUInteger)totalTileCount {
    DebugLog(@"Cached tile %lu of %lu.", (unsigned long)tileIndex, (unsigned long)totalTileCount);
    if (_currentlyDownloading) {
        float progress = (float)tileIndex / (float)totalTileCount;

        NSDictionary *progressDict = @{@"progress" : [NSNumber numberWithFloat:progress],
                                       @"routeId" : _downloadingRoute.routeId};

        [_currentTileHashes addObject:[RMTileCache tileHash:tile]];

        [[NSNotificationCenter defaultCenter] …
Run Code Online (Sandbox Code Playgroud)

objective-c nsmutablearray nsarray ios mapbox

6
推荐指数
1
解决办法
275
查看次数

如何使用Google离线访问令牌在iOS后台进行身份验证?

精简版:

我想使用Objective OAGoogle OAuth2客户端创建一个有效的GTMOAuth2Authentication对象供我在我的应用中使用,我可以从后端获取一个离线访问令牌.我怎么能做到这一点?

我的情况:

我的应用程序使用Analytics只读范围来获取有关用户网站的一些数据.我实现这一目标的方法是使用GTMOAuth2ViewControllerTouchGoogle OAuth2客户端为Objective C提供的ViewController 登录.然后,它为我提供了有效GTMOAuth2Authentication对象,我可以使用该对象通过Google API客户端查询Google Analytics .

现在,我们不希望为用户提供Google Analytics访问权限(有些人没有Google帐户,一般情况下,我们希望通过应用程序保持信息简单).这意味着我们必须使用我们的帐户登录(可以访问所有网站的Google Analytics数据).显然我们无法向用户提供我们的凭据,因此我们必须找到解决方案.

我的计划:

我认为这个问题可以通过从我们的后端请求我们的(离线访问)令牌字符串(通过SSL加密),将其保存到用户的钥匙串并在应用程序中进一步使用它来查询分析来解决.然后,我们让用户登录我们的服务(以便我们确定用户可以访问哪些网站),并显示数据.

我的问题:

我到处搜索,查看了谷歌(非常薄)的文档,检查了GTMOAuth2Authentication源代码,但我似乎无法解决这个问题.在我看来会有这样的解决方案(因为我在CMS中使用类似的方法让用户发布到我们的Facebook墙上),所以我在这里缺少什么?

当前登录代码:

GTMOAuth2ViewControllerTouch *viewController = [[GTMOAuth2ViewControllerTouch alloc]
                                                    initWithScope:scope
                                                    clientID:kMyClientID
                                                    clientSecret:kMyClientSecret
                                                    keychainItemName:kKeychainItemName
                                                    completionHandler:
    ^(GTMOAuth2ViewControllerTouch *viewController, GTMOAuth2Authentication *auth, NSError *error) {
        if (error != nil) {
            // Authentication failed
            DebugLog(@"Failed!");
        } else {
            // Authentication succeeded
            DebugLog(@"Success!");

            // Update interface
            self.loginButton.hidden = YES;

            self.authentication = auth;
        }
    }]; 
Run Code Online (Sandbox Code Playgroud)

我尝试过的:

我尝试手动创建一个 …

iphone authentication objective-c ios google-oauth

5
推荐指数
1
解决办法
1982
查看次数

使用Text-To-Speech postUtteranceDelay时躲避背景音乐不会解散

问题:

当使用文字转语音时,我希望背景音频变暗(或"躲避"),说出话语,然后解开背景音频.它主要起作用,但是当试图解开时,它会保持躲避而没有在停用时抛出错误.

上下文和代码:

说话的方法:

// Create speech utterance
AVSpeechUtterance *speechUtterance = [[AVSpeechUtterance alloc]initWithString:textToSpeak];
speechUtterance.rate = instance.speechRate;
speechUtterance.pitchMultiplier = instance.speechPitch;
speechUtterance.volume = instance.speechVolume;
speechUtterance.postUtteranceDelay = 0.005;

AVSpeechSynthesisVoice *voice = [AVSpeechSynthesisVoice voiceWithLanguage:instance.voiceLanguageCode];
speechUtterance.voice = voice;

if (instance.speechSynthesizer.isSpeaking) {
    [instance.speechSynthesizer stopSpeakingAtBoundary:AVSpeechBoundaryImmediate];
}

AVAudioSession *audioSession = [AVAudioSession sharedInstance];
NSError *activationError = nil;
[audioSession setActive:YES error:&activationError];
if (activationError) {
    NSLog(@"Error activating: %@", activationError);
}

[instance.speechSynthesizer speakUtterance:speechUtterance]; 
Run Code Online (Sandbox Code Playgroud)

然后在speechUtterance完成讲话后停用它:

- (void)speechSynthesizer:(AVSpeechSynthesizer *)synthesizer didFinishSpeechUtterance:(AVSpeechUtterance *)utterance
{
    dispatch_queue_t myQueue = dispatch_queue_create("com.company.appname", nil);
dispatch_async(myQueue, ^{
        NSError *error = …
Run Code Online (Sandbox Code Playgroud)

iphone avfoundation ios avaudiosession avspeechsynthesizer

4
推荐指数
1
解决办法
1104
查看次数