小编Ben*_*air的帖子

如何为iOS构建Unity3d插件

我有一个为iOS构建的非常小的Objective-C库,我想将它导出到Unity.我理解编写一个csharp包装器的基本过程,它将所有调用编组到本机库,但我完全不知道从哪里开始.任何人都可以逐步解释如何使用我的库创建一个统一包,以便我也可以将它分发给其他开发人员.

Unity3d文档非常简短,并没有解释任何内容.

谢谢.

objective-c unity-game-engine ios

63
推荐指数
2
解决办法
3万
查看次数

如何正确管理`AnyCancellable`的集合

我希望所有发布者都执行,除非明确取消。我不介意AnyCancellable基于文档,它会自动调用的范围走出去,但是canceldeinit这是不希望。

我曾尝试使用可取消的袋子,但AnyCancelable即使在出版商解雇了一个完成后仍然堆积如山。

我应该手动管理行李吗?我的印象store(in: inout Set)是为了方便管理可取消的实例,但它所做的只是推AnyCancellable入一个集合。

var cancelableSet = Set<AnyCancellable>()

func work(value: Int) -> AnyCancellable {
    return Just(value)
        .delay(for: .seconds(1), scheduler: DispatchQueue.global(qos: .default))
        .map { $0 + 1 }
        .sink(receiveValue: { (value) in
            print("Got value: \(value)")
        })
}

work(value: 1337).store(in: &cancelableSet)

DispatchQueue.main.asyncAfter(deadline: .now() + .seconds(5)) {
    print("\(cancelableSet)")
}
Run Code Online (Sandbox Code Playgroud)

到目前为止我想出了什么,它工作正常,但让我想知道Combine框架中是否缺少某些东西,或者它不应该以这种方式使用:

class DisposeBag {
    private let lock = NSLock()
    private var cancellableSet = Set<AnyCancellable>()

    func store(_ cancellable: AnyCancellable) {
        print("Store cancellable: …
Run Code Online (Sandbox Code Playgroud)

swift combine

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

MacOSX:OSAtomic与OSAtomicBarrier

对于这里的功能:

#include <libkern/OSAtomic.h>
Run Code Online (Sandbox Code Playgroud)

有OSAtomic和OSAtomicBarrier版本.

但是,文档未显示以下示例代码:

  1. 什么时候安全使用OSAtomic,没有OSAtomicBarrier版本
  2. 什么时候这OSAtomic将是不安全的,但OSAtomicBarrier将是安全的.

谁能提供解释+样本代码?

[没有实际代码的"你的意见"的随机漫游是没用的.读者:请投下这样的答案; 并用实际代码充满活力地回答.]

[C/C++代码首选; 大会也好.]

macos

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

转换为typeof(self)

是否有可能创建一个最终会返回一个对象的类别(扩展名)instancetype?我有一个类别来加载SKS文件,但由于这个类别适用于SKNode所有其他子类,如SKSceneSKEmitterNode等...也将采用它.

所以,我只是想避免总是从铸造SKNodeinstancetype.是否可以将返回类型更改为instancetype并确保编译器对返回值感到满意?

我想我可以使用-> Self返回类型,但后来我不知道如何转换scene为instancetype所以这个东西会编译..

例如:

SKEmitterNode.unarchiveFromFile("Blah") 会返回一个实例 SKEmitterNode

extension SKNode {
    class func unarchiveFromFile(file: String) -> SKNode {
        let path = NSBundle.mainBundle().pathForResource(file, ofType: "sks")
        var sceneData = NSData.dataWithContentsOfFile(path, options: .DataReadingMappedIfSafe, error: nil)

        let unarchiver = NSKeyedUnarchiver(forReadingWithData: sceneData)
        unarchiver.setClass(self.classForKeyedUnarchiver(), forClassName: "SKScene")

        let scene = unarchiver.decodeObjectForKey(NSKeyedArchiveRootObjectKey) as SKNode
        unarchiver.finishDecoding()

        return scene
    }
}
Run Code Online (Sandbox Code Playgroud)

swift

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

中断后AudioSessionSetActive失败

我试图弄清楚实际发生了几周的事情,我不知道为什么我不能在中断后继续播放,所以你们可能知道答案.AudioSessionSetActive(TRUE)总是返回'!cat',这是kAudioSessionIncompatibleCategory,重新激活,如果我的应用程序在后台播放,我在不同的应用程序.虽然它工作正常并且如果我在我的应用程序中发现中断时继续播放.

原始代码实际上包含在宏中包含的所有AudioSession和AudioQueue调用,如果它意味着错误,则打印OSStatus,但我删除它以获得更好的可读性.此外,[self pause]只是暂停,所以基本上它会在upause时调用AudioQueueStart(audioQueue,NULL)但是如果AudioSession失败则它不起作用.

音频会话初始化代码:

AudioSessionInitialize(NULL, NULL, _audioSessionInterruptionListener, self);
UInt32 sessionCategory = kAudioSessionCategory_MediaPlayback;
AudioSessionSetProperty(kAudioSessionProperty_AudioCategory, sizeof(sessionCategory), &sessionCategory);
AudioSessionAddPropertyListener(kAudioSessionProperty_AudioRouteChange, _audioSessionPropertyListener, self);
AudioSessionSetActive(TRUE);
Run Code Online (Sandbox Code Playgroud)

中断处理程序代码:

- (void)handleInterruptionChangeToState:(AudioQueuePropertyID)inInterruptionState 
{
    if(inInterruptionState == kAudioSessionBeginInterruption)
    {

        NSLog(@"+Interruption"); 

        if(self.state == NX_STATE_PLAY) 
        {
            [self pause];
            AudioSessionSetActive(FALSE);

            isPausedByInterruption = YES;
        }
    }
    else if(inInterruptionState == kAudioSessionEndInterruption) 
    {
        if(isPausedByInterruption) 
        {
            AudioSessionSetActive(TRUE);
            [self pause];

            isPausedByInterruption = FALSE;
        }

        NSLog(@"-Interruption");
    }
}
Run Code Online (Sandbox Code Playgroud)

这个流媒体源代码可以在这里找到https://bitbucket.org/and/amaudiostreamer/src/122de41fe6c0/AMAudioStreamer/AMAudioStreamer/Classes/NxAudioStreamer.m,如果它能帮助以某种方式解决问题..

iphone objective-c audioqueue interruption

8
推荐指数
1
解决办法
5768
查看次数

Xcode中的NSObject描述和自定义摘要

我覆盖了对象,-(NSString*)description但Xcode始终显示error: summary string parsing error在变量视图的摘要字段中.

我目前的实施如下:

- (NSString*)description {
    return [NSString stringWithFormat:@"<%@ %p> x=%f, y=%f", self.class, self, _x, _y];
}
Run Code Online (Sandbox Code Playgroud)

如果我输入po objectName控制台,LLDB会按预期显示精确输出,但Xcode和命令p objectName总是指示错误,那么使摘要字段工作的正确调试描述格式是什么?值得注意的是,"p"命令的输出与您在Xcode中看到的基础类实例的摘要消息相同.

更新:

据我所知,"WWDC 2012会话调试在Xcode中",自定义摘要只能使用自定义python脚本实现.-(NSString*)description或者-(NSString*)debugDescription方法无论如何都不会连接到摘要消息.我认为它们是因为我显示了一个错误,但它似乎是没有自己的格式化程序的类的标准消息.

xcode objective-c lldb

8
推荐指数
1
解决办法
4954
查看次数

Autolayout约束和子视图控制器

我有两个视图控制器,父母和孩子.

所以在viewDidLoad方法中我做了以下几点:

ChildViewController* childViewController = [[ChildViewController alloc] init];

[self addChildViewController:childViewController];

// ChildViewController sets his own constraints in viewDidLoad
[self.view addSubview:childViewController.view];

[childViewController didMoveToParentViewController:self];

//
// setup constraints to expand childViewController.view to 
// fill the size of parent view controller
//
Run Code Online (Sandbox Code Playgroud)

所以基本上会发生什么是updateViewConstraints在父控制器约束应用之前在ChildViewController上调用,所以实际上self.view.frame == CGRectZero,与我在自定义loadView方法中指定的完全相同ChildViewController.

translatesAutoresizingMaskIntoConstraints全部设置NO为所有视图.

在这种情况下设置约束的正确方法是什么,所以ChildViewController在父母之后更新他的约束?

来自两个控制器的当前日志非常令人沮丧,我不明白如何在viewWillLayoutSubviews之前调用updateViewConstraints:

App[47933:c07] ChildViewController::updateViewConstraints. RECT: {{0, 0}, {0, 0}}
App[47933:c07] ParentViewController::updateViewConstraints
App[47933:c07] ChildViewController:viewWillLayoutSubviews. RECT: {{0, 0}, {984, 454}}
App[47933:c07] ChildViewController:viewDidLayoutSubviews. RECT: {{0, …
Run Code Online (Sandbox Code Playgroud)

objective-c autolayout

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

当状态恢复时 hidesBottomBarWhenPushed = YES 时,导航控制器不隐藏标签栏

我在恢复视图控制器的状态时遇到问题,hidesBottomBarWhenPushed=YES在 UINavigationController 中推送放置在 UITabBarController 中。

发生的事情基本上是 UINavigationController 堆栈被恢复并且正确的控制器在屏幕上,但是该控制器不尊重 hidesBottomBarWhenPushed。

我想出的唯一可行的 hack 是 viewDidAppear 上的快速选项卡切换,使 TabBar 消失,因为它应该在设置 hidesBottomBarWhenPushed 时发生:

- (void)_fixTabBarStateRestorationBug {
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        NSInteger currentTab = (NSInteger)self.tabBarController.selectedIndex;
        self.tabBarController.selectedIndex = abs(currentTab - 1);
        self.tabBarController.selectedIndex = currentTab;
    });
}
Run Code Online (Sandbox Code Playgroud)

objective-c uikit ios

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

限制用户更新某些字段,但允许后端编辑它们

我在User模型上存储了一些永远不应由用户自己编辑的字段,而应仅由后端更新.所以我在beforeSave上做了验证:

// import all models
var Models = require('cloud/models/index');

// Models.User is a subclass of Parse.User
Parse.Cloud.beforeSave(Models.User, function (request, response) {
    var user = request.object;

    // prevent numberOfApples from being modified on clients
    if(user.existed()) {
        if(user.dirty('numberOfApples')) {
            response.error('User is not allowed to modify numberOfApples.');
            return;
        }
    }

    response.success();
});
Run Code Online (Sandbox Code Playgroud)

所以我检查之前是否存在模型,这很重要,所以这些东西不会在注册时触发.但后来我尝试从Parse仪表板手动更新该字段,它会引发错误.如何确保只允许用户编辑此字段,而仪表板或后端可以这样做(显然使用主密钥时).

parse-platform parse-cloud-code

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

How to *keep track* of object count in CoreData

I'd like to keep track of the number of specific managed objects. The same way NSFetchedResultsController does except that I do not need any data back, I just need a number. What's the most efficient way to do this?

As a side note, apparently I don't want to use NSFetchedResultsController in the most straightforward way because it would create bunch of faults and clog memory for no reason.

I was trying to achieve this by marrying NSCountResultType and NSFetchedResultsController but …

core-data objective-c ios magicalrecord

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