2015-05-05 3 views
2

Я хотел загрузить ASYNC изображение в камеру.Изображение из XML в ячейку

мой код:

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
    let cell = tableView.dequeueReusableCellWithIdentifier("Cell") as xmlParserDatenCell 

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), { 

     var test = UIImage(data: NSData(contentsOfURL: NSURL(string: daten[imagePath.row]["bildlink"]!)!)!) 
     cell.bild1.image = test 
     }) 

мой ответ от этого nil.

Идея этому не имеет. :(

я искал в Интернете часов

EDIT:.

вар Daten = [String: String] выглядит мой DATEN и мой анализатор возвращает это в:.

daten.append (String: String)

+0

Вы уверены, что 'daten' is' [String: String] '? Если это правда, вы не получите доступ к нему, как 'daten [index] [string]', это будет просто 'daten [string]'. Похоже, у вас есть множество словарей, или у вас есть архитектурная проблема. Без дополнительного кода мой ответ - это вся помощь, которую я могу предоставить. –

ответ

1

Здесь много чего не так. Когда вы покидаете основную очередь для асинхронизации, перед настройкой изображения вам нужно вернуться на главную. Кроме того, вам нужно отлаживать код, чтобы убедиться, что на каждом шаге вы получаете то, что ожидаете (т. Е. daten[0]["bildlink"] на самом деле возвращает адрес изображения?)

В любом случае, вот какой код, который должен работать, если вы используете быстрый 1.2, и xml фактически возвращает некоторые данные.

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)) {() -> Void in // background 
    var loadedImage: UIImage? //optional image, will be set if the rest succeeds 
    if let link = daten[indexPath.row]["bildlink"], // address for image 
    url = NSURL(string: link),     // .. to URL 
    data = NSData(contentsOfURL: url),   // .. to data 
    image = UIImage(data: data) {     // .. image from data 
     loadedImage = image 
    } 
    dispatch_async(dispatch_get_main_queue()) {() -> Void in // return to main thread 
    cell.bild1.image = loadedImage ?? nil // if above successful, actually set image 
    } 
} 

Вы должны также проверить, чтобы ячейка не использовалась повторно, прежде чем устанавливать изображение. Вы можете сделать это целую кучу способов, но я бы добавил свойство, подобное imageAddress, чтобы сохранить строку с daten[0]["bildlink"] и ссылаться на нее как if cell.imageAddress == link { cell.bild1.image = loadedImage }

+0

Здравствуйте, thx of Answear, да, это так .... 3Times ??? с \ n в конце ... и ваш код не будет использоваться, (println («Hello World») не отображается. – Daniel

+0

Не знаете, что вы имеете в виду? Можете ли вы предоставить дополнительную информацию? –

+0

Здравствуйте, thx для ответа. Хорошо, у меня была моя небольшая проблема. Мои номераOfSection не были установлены, тогда ваш код хорош, но я получаю сообщение об ошибке. Downcast from String? to String only Unwraps Otionals; dir вы хотите использовать «!». ? в этой точке: если let link = self.date [0] ["bildlink"] AS! (<- Here) String, что я могу сделать? ist на самом деле Sring. См. мое редактирование при запуске. – Daniel

0

Чтобы сделать асинхронной веб-запроса вы можете использовать:

NSURLConnection.sendAsynchronousRequest(urlRequest, queue: NSOperationQueue(), completionHandler:{ 
    (response:NSURLResponse!, data: NSData!, error: NSError!) -> Void in 
    // do stuff with response, data & error here 
}) 

Если вы используете его внутри cellForRowAtIndexPath :, вы можете не оказаться в той же ячейке, что и ожидалось, так как это асинхронно, и ячейки повторно используются, поэтому перед установкой изображения убедитесь, что у вас есть правильная ячейка:

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
    var cell = self.tableView!.dequeueReusableCellWithIdentifier("Cell") as UITableViewCell 

    var urlRequest = NSMutableURLRequest(URL: NSURL(string: daten[indexPath.row]["bildlink"]!)!) 

    NSURLConnection.sendAsynchronousRequest(urlRequest, queue: NSOperationQueue(), completionHandler:{ 
    (response:NSURLResponse!, data: NSData!, error: NSError!) -> Void in 
    if let cellToUpdate = self.tableView?.cellForRowAtIndexPath(indexPath) { 
     cellToUpdate.imageView?.image = UIImage(data: data) 
     // need to reload the view, which won't happen otherwise since this is in an async call 
     cellToUpdate.setNeedsLayout() 
    } 
    }) 
} 
+0

Здравствуйте, Christina :), поэтому я проверил ваш код, но он сработает на var cell = SELF (<- Here) .tableView! ..... with: TableViewController не имеет члена с именем «tableView» EDIT: I написал здесь правильно, а в моем коде неправильно жалко ... tableView это правильно ^^ (копия -> вставить ^^) – Daniel

+0

Поблагодарить u Christina. Ваш код и код от @Andrew помогли мне. :) – Daniel

Смежные вопросы