小编Rob*_*Rob的帖子

迅捷的segue过渡阴影

我正在使用故事板中的一些标准标记,每个标记都有相同的背景色。我遇到的问题是,当segue过渡快要完成时,整个框架周围都会出现像背景这样的深色阴影。

该图显示了过渡

这很微弱,但足以引起问题。有人遇到过吗?

storyboard ios segue swift

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

将完成处理程序与 DispatchQueue 一起使用

我了解到并发DispatchQueue允许其中的代码立即返回,因此不会阻塞调用线程。这通常与加载大数据的后台任务一起使用。

我还了解到完成处理程序(例如, in URLSession)允许在某些任务完成后执行处理程序中的代码。

我的问题是:这是否意味着并发调度队列和完成处理程序具有重叠的目的?如果我已经使用了完成处理程序,就不需要用并发调度队列包装它吗?

比如下面是一个使用 URLSession 的耗时的数据加载任务,用并发调度队列包装它是不是一个好主意?

URLSession(configuration: URLSessionConfiguration.default).dataTask(with: propertiesRequest) { data, response, error in
        // print("within dataTask: data: \(data), response: \(response), error: \(error)")
        if let error = error {
            print(error)
        } else if let httpResponse = response as? HTTPURLResponse {
            if httpResponse.statusCode == 200 {
                print("success: property task request")


                do {

                    handler(responseDict, nil) // This is a function supplied by caller

                } catch let error as NSError {
                    handler(nil, error)
                }
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

concurrency grand-central-dispatch completionhandler nsurlsession swift

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

在Swift中将AppDelegate类声明为'final'是不好的做法吗?

现在,我正在尝试使用Git中的一个名为Insomnia的类来防止设备在充电时锁定.如果你好奇的话,这个项目就在这里.对于示例代码,它让我这样做:

final class AppDelegate: UIResponder, UIApplicationDelegate {
      private let insomnia = Insomnia(mode: .whenCharging)
      //app delegate code
 }
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,它已声明AppDelegatefinal使得insomnia变量未被释放,这将阻止它工作.但是,我不确定,这是不好的做法宣布我AppDelegatefinal?或者这会导致我的应用程序出现问题吗?如果这是不好的做法,有没有更好的方法来确保insomnia不被解除分配?

ios appdelegate swift

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

在 swift 4 中使用 Base64 将图像转换为字符串

我的 php 代码在服务器上创建了一个空图像

这是我的代码(swift4):

var encoded_img = imageTobase64(image: image1.image!)

func convertImageToBase64(image: UIImage) -> String {
    let imageData = UIImagePNGRepresentation(image)!
    return imageData.base64EncodedString(options:   Data.Base64EncodingOptions.lineLength64Characters)
}
Run Code Online (Sandbox Code Playgroud)

代码:

$decodimg = base64_decode(_POST["encoded_img"]);
file_put_contents("images/".$imgname,$decodimg);  
Run Code Online (Sandbox Code Playgroud)

以及准备请求的代码:

@IBAction func BtnSend(_ sender: UIButton) {
    var url = "http://xxxxxx/msg.php"
    var encoded_img = imageTobase64(image: image1.image!)    
    let postData = NSMutableData(data: ("message=" + message).data(using: String.Encoding.utf8)!)
    postData.append(("&encoded_img=" + encoded_img).data(using: String.Encoding.utf8)!)    
     request = NSMutableURLRequest(url: NSURL(string: url)! as URL,
 cachePolicy: .useProtocolCachePolicy,
 timeoutInterval: 20.0)
request.httpMethod = "POST"
request.httpBody = postData as Data

let session = URLSession.shared

let …
Run Code Online (Sandbox Code Playgroud)

base64 image swift

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

如何为CGpath数组的绘制设置动画?

我正在尝试制作一个为用户绘制对象的应用程序.我现在有一个这样的对象,它是由一个类型的数组构成的[UIBezierPath].然后我使用循环UIBezierPath将数组中的所有s 更改为CGPaths,然后想要逐个绘制那些路径的动画.但是,当我尝试使用此代码时,它不起作用,我无法在网上找到任何有用的信息.这是代码被使用来转换阵列macbookPath它由UIBezierPathCGPath:

for path in macbookPath {
        drawingPath.append(path.cgPath)
    }
Run Code Online (Sandbox Code Playgroud)

然后我使用此代码尝试绘制路径:

for cgPath in drawingPath {
        shapeLayer.path = cgPath
    }
Run Code Online (Sandbox Code Playgroud)

这是函数的其余代码,drawForm()它应该将表单绘制到一个名为的视图上aiDrawView:

@objc func drawForm() {
    var drawingPath = [CGPath]()
    var macbookPath = Forms.MacbookForm()
    let shapeLayer = CAShapeLayer()
    shapeLayer.frame = aiDrawView.bounds

    for path in macbookPath {
        drawingPath.append(path.cgPath)
    }

    for cgPath in drawingPath {
        shapeLayer.path = cgPath
    }

    let strokeEndAnimation = CABasicAnimation(keyPath: "strokeEnd")
    strokeEndAnimation.duration = 2.0
    strokeEndAnimation.fromValue …
Run Code Online (Sandbox Code Playgroud)

cabasicanimation cashapelayer cgpath uibezierpath swift

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

为什么 concurrentQueue.sync 不会导致死锁

这段代码会死锁,因为:

  1. 他们在同一个线程中
  2. 打印(2)必须等待打印(3)
  3. 打印(3)必须等待打印(2)

例如:

DispatchQueue.main.async {
    print(Thread.current)
    DispatchQueue.main.sync {
        print(Thread.current)
        print(2)
    }
    print(3)
}
Run Code Online (Sandbox Code Playgroud)

为什么在concurrentQueue不会造成死锁?他们也在同一个线程中。

DispatchQueue.global().async {
    print(Thread.current)
    DispatchQueue.global().sync {
        print(Thread.current)
        print(2)
    }
    print(3)
}
Run Code Online (Sandbox Code Playgroud)

concurrency deadlock grand-central-dispatch ios

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

调度信号量是否会无意中使自身陷入死锁?

假设我们有一个共享资源,许多不同的全局队列都可以访问该资源,并且为了解决这个问题,我们使用调度信号量来管理该访问。当这些全局队列之一告诉信号量等待时,信号量计数就会递减,并且该线程可以访问共享资源。是否有可能在信号量等待时,另一个(不同的)全局队列尝试访问这个共享资源,而GCD从其池中抓取的线程与为前一个队列(当前正在制作的队列)抓取的线程相同信号量等待)这会导致该线程死锁并阻止信号量计数重新递增?

grand-central-dispatch ios dispatchsemaphore

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

NSURLSession 内存泄漏

在 xcode 仪器中,我遇到此方法内存泄漏

- (void)getDataForRequest:(NSURLRequest *)request completionHandler:(downloadCompletionBlock)completionHandler
{
    self.expectedLength = 0;
    self.currentLength = 0;
    self.responseData = Nil;
    
    self.contentLengthBlock = nil;
    self.completionBlock = completionHandler;
    
    NSURLSession *session = [NSURLSession sharedSession];
    
    NSURLSessionConfiguration *defaultConfigObject = [NSURLSessionConfiguration defaultSessionConfiguration];
    
    session = [NSURLSession sessionWithConfiguration:defaultConfigObject delegate: self delegateQueue: [NSOperationQueue mainQueue]];
    
    self.postDataTask = [session dataTaskWithRequest:request];
    
    [self.postDataTask resume];
}
Run Code Online (Sandbox Code Playgroud)

memory-leaks objective-c ios

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

DispatchQueue 的行为不像串行队列

通过使用以下代码,我期望每次调用 func 时,执行之间的最短时间为 3-4 秒。

但是:当我writeData()连续调用4 次时,我看到异步块在不等待前一次调用完成的情况下执行。

func writeData(){
    DispatchQueue(label: "be.io").asyncAfter(deadline: .now() + 1) {
        print("START :\(Int64((Date().timeIntervalSince1970 * 1000.0).rounded()))")
        Thread.sleep(forTimeInterval: 3)
    }
}
...
writeData()
writeData()
writeData()
writeData()
Run Code Online (Sandbox Code Playgroud)

预期的输出应该是这样的:

START :1611250630000
START :1611250634000
START :1611250638000
START :1611250642000
Run Code Online (Sandbox Code Playgroud)

但在执行时,我得到了所有 4 个调用相同的时间戳(大约 1 毫秒的差异)。

START :1611250630000
START :1611250630000
START :1611250630000
START :1611250630000
Run Code Online (Sandbox Code Playgroud)

我在做什么错?

PS我毫不拖延地尝试了异步,没有运气。

grand-central-dispatch ios swift dispatch-queue

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

DispatchQueue.global()默认qos是userInitiated?

我写一个演示

let queue = DispatchQueue.global()
queue.async {
    let group = DispatchGroup()
    group.enter()
    DispatchQueue.global().asyncAfter(deadline: DispatchTime.now(), qos: .default) {
        //do sth in default queue
        group.leave()
    }
    group.wait()
    DispatchQueue.main.async { [weak self] in
        //do sth in main queue
    }
}
Run Code Online (Sandbox Code Playgroud)

然后我收到线程性能检查警告

以 QOS_CLASS_USER_INITIATED 运行的线程正在等待以 QOS_CLASS_DEFAULT 运行的较低 QoS 线程。研究避免优先级倒置的方法

我尝试打印它显示的外部队列的 qos

(lldb) print queue.qos
(Dispatch.DispatchQoS) $R0 = {
  qosClass = unspecified   //I think this should be default.
  relativePriority = 0
}
Run Code Online (Sandbox Code Playgroud)

苹果文档错了?

class func global(qos: DispatchQoS.QoSClass = .default) -> DispatchQueue
Run Code Online (Sandbox Code Playgroud)

queue grand-central-dispatch ios swift

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