我的iPad应用程序与XML提要同步,在NSOperationQueue执行的NSOperation子类中运行同步.当它解析feed时,它会回调主线程performSelectorOnMainThread:withObject:waitUntilDone:来更新UI的各个部分,安排下载等.其中一些非常昂贵; 随着同步的进行,UI有时会在一两秒内无响应.
为了使UI更具响应性,我删除了使用performSelectorOnMainThread:withObject:waitUntilDone:支持直接调用来执行所有与同步相关的任务,包括更新UI.所以现在同步完全发生在NSOperationQueue创建的后台线程上.这似乎工作得很好,并且在同步期间UI更具响应性.
但是,我很抱歉以这种方式发布它.我在各个地方看到过一些人应该只更新主线程上的UI(例如参考AppKit).但我一直无法在文档中找到关于此主题的任何具体内容.
那么更新主线程上的UI有多重要?应用程序的哪些部分是线程安全的,哪些不是?是否有一个参考解释在NSOperation中执行什么是安全的,哪些应该只在iOS的主线程上执行?我真的在做一些不安全或容易崩溃的事情吗?
我写了一个简单的视图控制器,显示模态弹出对话框.因为它创建了一个覆盖整个屏幕的新窗口,所以我添加了一个UIDeviceOrientationDidChangeNotification观察器,用于确定如何使用旋转视图CGAffineTransformMakeRotation().它似乎工作.
大多.不利的一面是,我可以摆弄方向,让它最终横向或颠倒.看看这个18s视频演示了这个问题.在调试中,似乎有时通知不会触发,或者至少不会调用正在侦听它的回调方法.
但是,我必须遗漏一些东西,因为如果你再看一下视频,你会注意到它后面的视图确实正确旋转.那个是由管理-willAnimateRotationToInterfaceOrientation:duration:.如何正确调用iOS控制器方法(可能是由UIDeviceOrientationDidChangeNotificationUIViewController中的观察者管理),但我自己的代码不是?
我正在四个 PostgreSQL 工作人员之间设置双向复制,并且我想让我的 Go 数据库连接池处理所有四个工作人员的连接。它应该能够为它们创建多个连接,为任何给定的查询随机选择一个,并在连接断开时进行故障转移。这在 Go 数据库库中可行吗?或者我应该只使用pgBouncer而不是尝试让database/sql或pgx来处理这种平衡?
我有一个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,放手,它跳跃,然后它动画回到它所属的位置.
我想也许我需要设置锚点并在动画外部居中,也许将中心设置为超级视图中的位置,就像手势开始时一样,但这似乎没有区别.
我在这里错过了什么?当用户放手时,如何防止跳转?
鉴于这个简短的计划:
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方法就不行.
每当位置发生变化时,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将有四个值:西南角的纬度和长度以及东北角的纬度和长度.
我想要使用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) 我想为特征创建一个盒装结构字段,其中特征具有关联类型。下面是一个使用digest::Digest的例子:
use digest::Digest;
struct Crypto {
digest: Box<dyn Digest>,
}
Run Code Online (Sandbox Code Playgroud)
这无法编译并出现错误:
必须指定关联类型的值
OutputSize(来自 traitdigest::Digest)
有时我可能想使用sha2 ::Sha256 有时使用 sha2::Sha512,每个都有不同的OutputSize. 是否可以创建具有动态关联类型的盒装结构字段?如果是这样,如何?
我有一个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 ×4
go ×3
ios ×2
uiview ×2
accessor ×1
animation ×1
box ×1
cglayer ×1
cgrect ×1
cllocation ×1
compile-time ×1
concurrency ×1
dynamic ×1
field ×1
function ×1
geolocation ×1
json ×1
marshalling ×1
nsoperation ×1
orientation ×1
postgresql ×1
reflection ×1
replication ×1
runtime ×1
rust ×1
simulator ×1
slice ×1
uidevice ×1
uikit ×1
uitableview ×1