小编the*_*ory的帖子

使用`performSelectorOnMainThread:withObject:waitUntilDone:`来自NSOperation?有多重要?

我的iPad应用程序与XML提要同步,在NSOperationQueue执行的NSOperation子类中运行同步.当它解析feed时,它会回调主线程performSelectorOnMainThread:withObject:waitUntilDone:来更新UI的各个部分,安排下载等.其中一些非常昂贵; 随着同步的进行,UI有时会在一两秒内无响应.

为了使UI更具响应性,我删除了使用performSelectorOnMainThread:withObject:waitUntilDone:支持直接调用来执行所有与同步相关的任务,包括更新UI.所以现在同步完全发生在NSOperationQueue创建的后台线程上.这似乎工作得很好,并且在同步期间UI更具响应性.

但是,我很抱歉以这种方式发布它.我在各个地方看到过一些人应该只更新主线程上的UI(例如参考AppKit).但我一直无法在文档中找到关于此主题的任何具体内容.

那么更新主线程上的UI有多重要?应用程序的哪些部分是线程安全的,哪些不是?是否有一个参考解释在NSOperation中执行什么是安全的,哪些应该只在iOS的主线程上执行?我真的在做一些不安全或容易崩溃的事情吗?

concurrency cocoa-touch uikit nsoperation ios

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

为什么不总是调用已注册的UIDeviceOrientationDidChangeNotification?

我写了一个简单的视图控制器,显示模态弹出对话框.因为它创建了一个覆盖整个屏幕的新窗口,所以我添加了一个UIDeviceOrientationDidChangeNotification观察器,用于确定如何使用旋转视图CGAffineTransformMakeRotation().它似乎工作.

大多.不利的一面是,我可以摆弄方向,让它最终横向或颠倒.看看这个18s视频演示了这个问题.在调试中,似乎有时通知不会触发,或者至少不会调用正在侦听它的回调方法.

但是,我必须遗漏一些东西,因为如果你再看一下视频,你会注意到它后面的视图确实正确旋转.那个是由管理-willAnimateRotationToInterfaceOrientation:duration:.如何正确调用iOS控制器方法(可能是由UIDeviceOrientationDidChangeNotificationUIViewController中的观察者管理),但我自己的代码不是?

notifications cocoa-touch orientation uitableview uidevice

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

如何获取 Golang 数据库连接池来管理与集群中多个主机的连接?

我正在四个 PostgreSQL 工作人员之间设置双向复制,并且我想让我的 Go 数据库连接池处理所有四个工作人员的连接。它应该能够为它们创建多个连接,为任何给定的查询随机选择一个,并在连接断开时进行故障转移。这在 Go 数据库库中可行吗?或者我应该只使用pgBouncer而不是尝试让database/sql或pgx来处理这种平衡?

postgresql replication connection-pooling go postgresql-bdr

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

为什么在动画块中设置图层anchorPoint时我的视图会跳转?

我有一个UIPanGestureRecognizer附加到我的iOS应用程序中的视图.我从平底锅处理程序的Touches示例应用程序中复制了代码.手势开始时,我的代码:

  • 记录原始锚点和中心.
  • 将锚点和中心更改为围绕用户的手指,如下所示:

    CGPoint locationInView = [gestureRecognizer locationInView:target];
    CGPoint locationInSuperview = [gestureRecognizer locationInView:target.superview];
    target.layer.anchorPoint = CGPointMake(
        locationInView.x / target.bounds.size.width,
        locationInView.y / target.bounds.size.height
    );
    target.center = locationInSuperview;
    
    Run Code Online (Sandbox Code Playgroud)

随着手势的进行,平移处理器不断地改变中心以跟踪手指的移动.到现在为止还挺好.

当用户放手时,我希望视图动画回到其原始起点.执行此操作的代码如下所示:

[UIView animateWithDuration:2 delay:0 options:UIViewAnimationCurveEaseOut animations:^{
    target.center            = originalCenter;
    target.layer.anchorPoint = originalAnchorPoint;
}];
Run Code Online (Sandbox Code Playgroud)

这确实使视图回归到其原始起点.但是,在动画开始之前,视图会跳转到UI中的其他位置.IOW,放手,它跳跃,然后它动画回到它所属的位置.

我想也许我需要设置锚点并在动画外部居中,也许将中心设置为超级视图中的位置,就像手势开始时一样,但这似乎没有区别.

我在这里错过了什么?当用户放手时,如何防止跳转?

animation cocoa-touch uiview cglayer

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

iOS ARM代码可以在模拟器中运行吗?

如果我分发一个在编译时检测模拟器的iOS框架库,那么为模拟器编译的胖二进制文件的部分将始终在模拟器中工作,并且#if TARGET_IPHONE_SIMULATOR宏外部的代码将始终在设备上工作.那么在运行时检测模拟器真的有必要吗?

换句话说,胖设备的ARM设备部分是否都能在模拟器上运行?

simulator runtime compile-time ios

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

为什么Go函数字段设置器不保留功能?

鉴于这个简短的计划:

package main

import "fmt"

type Foo struct {
    doer func()
}

func (f Foo) SetDoer(doer func()) {
    f.doer = doer
}

func main() {
    foo := Foo{func() { fmt.Println("original") }}
    foo.doer()
    foo.SetDoer(func() { fmt.Println("replacement") })
    foo.doer()
}
Run Code Online (Sandbox Code Playgroud)

输出是:

original
original
Run Code Online (Sandbox Code Playgroud)

我原以为是:

original
replacement
Run Code Online (Sandbox Code Playgroud)

为什么不呢?请注意,如果我foo.doer直接设置,输出是预期的main().如果我使用这种SetDoer方法就不行.

field function accessor go

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

如何计算地理点周围的矩形?

每当位置发生变化时,CLLocationManager都会向我的委托发送新的CLLocation.该位置的坐标表示为CLLocationCoordinate2D对象,该对象仅包含纬度和经度.我想取这个位置,确定南纬1000米,西经1000度,北纬1000米,东经1000米的纬度和经度.这样我最终得到位于该位置西南方向的一个坐标和该位置的一个东北方向.

我不知道如何做到这一点,今晚我的GoogleFoo看起来很糟糕.我发现的哪些信息提供了难以理解的数学.有人帮助brotha黑客吗?如果有的话,我可以使用iOS API,但是只对doublelat和long的值进行操作的等式会更好.它不必在厘米内准确,但在米内会很好.理想情况下,它看起来像这样:

NSArray *rect = CalculateRectangleFromLocation(
    clLocationCoordinate2D,
    1000.0
);
Run Code Online (Sandbox Code Playgroud)

然后*rect将有四个值:西南角的纬度和长度以及东北角的纬度和长度.

geolocation latitude-longitude cllocation

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

如何说服 UnmarshalJSON 使用切片子类型?

我想要使​​用base64 RawURLEncoding而不是.json 来编组和解组 JSON 的字节切片StdEncoding。没有明显的方法可以通过编码/json包来做到这一点,这是明智的,所以我想我应该创建一个子类型来做到这一点。

type Thing []byte
Run Code Online (Sandbox Code Playgroud)

编组支持很简单:

func (thing Thing) MarshalJSON() ([]byte, error) {
    if thing == nil {
        return []byte("null"), nil
    }
    return []byte(`"` + base64.RawURLEncoding.EncodeToString(thing) + `"`), nil
}
Run Code Online (Sandbox Code Playgroud)

但 Unmarshal 却没有那么多。我追踪了编码/json源,并提出了:

func (thing Thing) UnmarshalJSON(data []byte) error {
    v := reflect.ValueOf(&thing)
    if len(data) == 0 || data[0] == 'n' { // null
        v.SetBytes([]byte{})
        return nil
    }
    data = data[1 : len(data)-1]
    dst := make([]byte, base64.RawURLEncoding.DecodedLen(len(data)))
    n, err := …
Run Code Online (Sandbox Code Playgroud)

reflection json marshalling go slice

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

如何为 Box<dyn Trait> 字段指定关联类型的值?

我想为特征创建一个盒装结构字段,其中特征具有关联类型。下面是一个使用digest::Digest的例子:

use digest::Digest;
struct Crypto {
    digest: Box<dyn Digest>,
}
Run Code Online (Sandbox Code Playgroud)

这无法编译并出现错误:

必须指定关联类型的值OutputSize(来自 trait digest::Digest)

有时我可能想使用sha2 ::Sha256 有时使用 sha2::Sha512,每个都有不同的OutputSize. 是否可以创建具有动态关联类型的盒装结构字段?如果是这样,如何?

dynamic rust associated-types box

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

如何将帧*和*变换从一个UIView传输到另一个UIView而不失真?

我有一个UIView可能会应用比例和/或旋转变换.我的控制器创建一个新控制器并将视图传递给它.新控制器创建一个新视图,并尝试将其放置在与传递视图相同的位置和旋转中.它通过转换原始视图的框架来设置位置和大小:

CGRect frame = [self.view convertRect:fromView.frame fromView:fromView.superview];
ImageScrollView *isv = [[ImageScrollView alloc]initWithFrame:frame image:image];
Run Code Online (Sandbox Code Playgroud)

这很好用,缩放的大小和位置完美复制.但是,如果有变换应用到旋转fromView,它并没有转移.

所以我添加了这一行:

isv.transform = fromView.transform;
Run Code Online (Sandbox Code Playgroud)

很好地处理转移旋转,但也转换比例转换.结果是缩放变换有效地应用了两次,因此得到的视图太大了.

那么如何将位置(原点),比例和旋转从一个视图转移到另一个视图,而不会使比例增加一倍?


编辑

这是一个更完整的代码示例,其中原始的UIImageView(fromView)用于调整和定位UIScrollView(ImageScrollView子类):

CGRect frame = [self.view convertRect:fromView.frame fromView:fromView.superview];
frame.origin.y += pagingScrollView.frame.origin.y;
ImageScrollView *isv = [[ImageScrollView alloc]initWithFrame:frame image:image];
isv.layer.anchorPoint = fromView.layer.anchorPoint;
isv.transform = fromView.transform;
isv.bounds = fromView.bounds;
isv.center = [self.view convertPoint:fromView.center fromView:fromView.superview];
[self.view insertSubview:isv belowSubview:captionView];
Run Code Online (Sandbox Code Playgroud)

这是ImageScrollView中的整个配置:

- (id)initWithFrame:(CGRect)frame image:(UIImage *)image {
    if (self = [self initWithFrame:frame]) {
        CGRect rect = CGRectMake(0, …
Run Code Online (Sandbox Code Playgroud)

cocoa-touch uiview cgaffinetransform cgrect

0
推荐指数
1
解决办法
1916
查看次数