小编Rya*_*yan的帖子

global().async中的main.sync是什么意思?

在Swift中,我有时会使用这种模式.

DispatchQueue.global().async {
    // do stuff in background, concurrent thread

    DispatchQueue.main.sync {
        // update UI
    }
}
Run Code Online (Sandbox Code Playgroud)

这种模式的目的很明确.在全局线程中进行耗时的计算,因此UI未被锁定,并且在计算完成后更新主线程中的UI.

如果没有什么可计算的怎么办?我刚刚在我的项目中发现了一个逻辑

//A
DispatchQueue.main.sync {
    // do something
}
Run Code Online (Sandbox Code Playgroud)

崩溃但是

// B
DispatchQueue.global().async {
    DispatchQueue.main.sync {
        // do something
    }
}
Run Code Online (Sandbox Code Playgroud)

没有崩溃.

他们有什么不同?案例B是否与此不同?

// C
DispatchQueue.main.async {
    // do something
}
Run Code Online (Sandbox Code Playgroud)

还有一个问题.我知道主线程是串行队列,但如果我多个运行多个代码块main.async,它就像并发队列一样.

DispatchQueue.main.async {
    // do A
}

DispatchQueue.main.async {
    // do B
}
Run Code Online (Sandbox Code Playgroud)

如果主线程实际上是一个串行队列,它们如何同时运行?如果它只是一个时间切片而不是它们与全局并发队列的不同而不是主线程可以更新UI?

grand-central-dispatch ios swift

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

在iOS 11(或Xcode 9)中加载字体

我一直在使用Futura-Demi.otf字体.

使用下面的代码,我可以确认此文件包含多个字体.

for fname in UIFont.familyNames {
    for name in UIFont.fontNames(forFamilyName: fname) {
        print(name)
    }
}
Run Code Online (Sandbox Code Playgroud)

字体系列是Futura,它包含如下字体:

Futura-CondensedExtraBold
Futura-Dem
Futura-Medium
Futura-Bold
Futura-CondensedMedium
Futura-MediumItalic
Run Code Online (Sandbox Code Playgroud)

到目前为止,我已经毫无困难地使用了Futura-Dem字体UIFont(name: "Futura-Dem", size: 21).但是在iOS 11发布后,我再也不能使用这种字体了.即使在已经在App Store中的应用程序中,所有Futura-Dem字体也会更改为Futura-Medium.

我检查,通过加载的字体UIFont(name: "Futura-Dem", size: 21)Futura-Medium字体和我还发现,我可以使用Futura-Dem的字体与

let des = UIFontDescriptor(name: "Futura-Dem", size: 21)
let font = UIFont(descriptor: des, size: 21)
Run Code Online (Sandbox Code Playgroud)

上面的代码加载Futura-Dem成功,但我不知道为什么我不能UIFont(name: "Futura-Dem", size: 21)像以前那样使用它.

fonts ios swift

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

AVPlayerItem即使状态为“ readyToPlay”且“ isPlaybackLikelyToKeepUp”为true也不会播放视频

我正在使用AVPlayer和播放实时视频AVPlayerItem。我观察AVPlayerItemstatusisPlaybackLikelyToKeepUpAVPlayerItemPlaybackStalled。我还观察到AVPlayerrate

在测试时,我发现确实发生了奇怪的事情。

AVPlayer正常播放视频(AVPlayerItem.status == readyToPlayAVPlayerItem.isPlaybackLikelyToKeepUp == true)的同时,如果按主屏幕按钮,该按钮将AVPlayer.rate变为0.0。这意味着玩家停止了游戏。

当应用程序就回到前台,我按下播放按钮,它仍然是AVPlayerItem.status == readyToPlayAVPlayerItem.isPlaybackLikelyToKeepUp == true,但暂停后有一段时间开始播放。

我想知道播放器已暂停或正在播放。在这种情况下,即使播放器未在播放视频,状态也会指示其正在播放。(AVPlayerItem.status == readyToPlayAVPlayerItem.isPlaybackLikelyToKeepUp == trueAVPlayer.rate == 1.0

我检查AVPlayerItemloadedTimeRangesitem.loadedTimeRanges.first不为零(loadedTimeRanges只有一个项目)及其startduration不为0。

我应该检查什么?

我要补充一点。

此症状仅在流式(m3u8)上发生,而在vod(mp4)上不发生。

所以我想这是缓冲数据的问题。播放器正在播放时,缓冲区中有数据要播放,并且数据仍然有效。应用背景去,回到前台后,玩家的缓冲仍然有数据,所以isPlaybackLikelyToKeepUp == trueAVPlayerItem.status == readyToPlay。但是,当我尝试播放时,会AVPlayer刷新缓冲区,因为它很旧。 …

ios avplayer avplayeritem

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

如何在 SwiftUI 中为图像设置动画,播放帧动画

我想在 SwiftUI 的图像视图中为图像设置动画

首先,我尝试创建一些变量和一个函数来切换 Image("imageVariable")。它改变了但没有动画甚至尝试了该withAnimation { }方法

其次,我尝试使用 UIKit 视图。在这里,动画有效,但我无法应用resizable()修改器或设置固定帧

var images: [UIImage]! = [UIImage(named: "pushup001")!, UIImage(named: "pushup002")!]

let animatedImage = UIImage.animatedImage(with: images, duration: 0.5)

struct workoutAnimation: UIViewRepresentable {

    func makeUIView(context: Self.Context) -> UIImageView {
        return UIImageView(image: animatedImage)
    }

    func updateUIView(_ uiView: UIImageView, context: UIViewRepresentableContext<workoutAnimation>) {

    }
}


struct WorkoutView: View {
    var body: some View {
        VStack {
            workoutAnimation().aspectRatio(contentMode: .fit)
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

在方法 1 中我可以更改图像但不能设置动画,而在方法 2 中我可以设置动画但不能控制它的大小

uiimageview ios swift swiftui

5
推荐指数
2
解决办法
7894
查看次数

为什么 Data.endIndex 和 Data.count 不同?

let str = "This is a swift bug"\nlet data = Data(str.utf8)\nprint("data size = ", data.endIndex, data.count)\n\nlet trimmed = data[2..<data.endIndex]\nprint("trimmed size = ", trimmed.endIndex, trimmed.count)\n
Run Code Online (Sandbox Code Playgroud)\n

结果是

\n
data size =  19 19\ntrimmed size =  19 17\n
Run Code Online (Sandbox Code Playgroud)\n

根据苹果文档endIndex

\n
This is the \xe2\x80\x9cone-past-the-end\xe2\x80\x9d position, and will always be equal to the count.\n
Run Code Online (Sandbox Code Playgroud)\n

这是一个错误吗?或者我错过了什么?

\n

swift

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

有没有办法从UINavigationController的堆栈中删除特定的视图控制器?

我想从UINavigationController的堆栈中删除一个viewController.

可能吗?我发现UINavigationController.viewControllers是一种NSArray,它意味着我无法改变.

我也知道我可以使用popViewController()或pushViewController()更改堆栈(NSArray).这怎么可能?

我可以将UINavigationController中的特定viewController更改为其他viewController吗?或者有没有办法从堆栈中删除viewController?

xcode stack objective-c uinavigationcontroller

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

Array.filter比循环便宜吗?

有一个filter功能Array.我不知道它是不是用平常便宜loop一样for.

如果是这样,为什么?

arrays swift

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

Swift 3:在UIWebView中加载GIF

我想在我的swift 3应用程序中加载GIF.我使用这段代码来做到这一点,但没有显示gif.

let filePath = Bundle.main.path(forResource: “myGif”, ofType: "gif")
let gif = NSData(contentsOfFile: filePath!)
self.webView.load(gif! as Data, mimeType: "image/gif", textEncodingName: String(), baseURL: NSURL() as URL)
self.webView.isUserInteractionEnabled = false
Run Code Online (Sandbox Code Playgroud)

我不知道我的代码有什么问题(我是swift和iOS开发的新手).

有什么帮助吗?

gif uiwebview ios swift

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